使用核心 SQLAlchemy 插入和更新

Posted

技术标签:

【中文标题】使用核心 SQLAlchemy 插入和更新【英文标题】:Insert and update with core SQLAlchemy 【发布时间】:2014-02-08 00:30:40 【问题描述】:

我有一个没有元数据或 orm 类的数据库(数据库已经存在)。

我设法让选择的东西通过:

from sqlalchemy.sql.expression import ColumnClause
from sqlalchemy.sql import table, column, select, update, insert
from sqlalchemy.ext.declarative import *
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
import pyodbc

db = create_engine('mssql+pyodbc://pytest')
Session = sessionmaker(bind=db)
session = Session()

list = []
list.append (column("field1"))
list.append (column("field2"))
list.append (column("field3"))

s = select(list)
s.append_from('table')
s.append_whereclause("field1 = 'abc'")
s = s.limit(10)

result = session.execute(s)
out = result.fetchall()

print(out)

到目前为止一切顺利。

我可以让更新/插入工作的唯一方法是执行如下原始查询:

session.execute(<Some sql>)

我想做它,这样我就可以用它来做一门课:

u = Update("table")
u.Set("file1","some value")
u.Where(<some conditon>)

seasion.execute(u)

尝试过(这只是我尝试过的方法之一):

i = insert("table")
v = i.values(["name":"name1", "name":"name2"])

u = update("table")
u = u.values("name": "test1")

我无法让它执行:

session.execute(i)

session.execute(u)

任何建议如何在不编写 ORM 模型的情况下构造插入或更新?

【问题讨论】:

【参考方案1】:

正如您从 SQLAlchemy Overview 文档中看到的那样,sqlalchemy 构建有两层:ORMCore。目前,您仅使用 Core 的一些构造并手动构建所有内容。

为了使用Core,你应该让 SQLAlchemy 知道一些关于你的数据库的元信息,以便它对其进行操作。假设您有一个表 mytable,其中包含 field1, field2, field3 列和已定义的 primary key,下面的代码应该执行您需要的所有任务:

from sqlalchemy.sql import table, column, select, update, insert

# define meta information
metadata = MetaData(bind=engine)
mytable = Table('mytable', metadata, autoload=True)

# select
s = mytable.select() # or:
#s = select([mytable]) # or (if only certain columns):
#s = select([mytable.c.field1, mytable.c.field2, mytable.c.field3])
s = s.where(mytable.c.field1 == 'abc')
result = session.execute(s)
out = result.fetchall()
print(out)

# insert
i = insert(mytable)
i = i.values("field1": "value1", "field2": "value2")
session.execute(i)

# update
u = update(mytable)
u = u.values("field3": "new_value")
u = u.where(mytable.c.id == 33)
session.execute(u)

【讨论】:

在搜索了 2 天后,发现其中的大部分内容还是要为我清理的坦克 为什么是会话而不是事务?从文档中,会话应该与 ORM 一起使用,对吧?

以上是关于使用核心 SQLAlchemy 插入和更新的主要内容,如果未能解决你的问题,请参考以下文章

获取 sqlalchemy 的 upsert 中插入和更新记录的计数

Flask-SQLAlchemy:如何有条件地插入或更新一行

SQLAlchemy - 在 postgresql 中执行批量 upsert(如果存在,更新,否则插入)

Python使用SQLAlchemy连接数据库并创建数据表插入数据删除数据更新表查询表(CRUD)

使用 sqlalchemy 核心调用 GeomFromText 和其他此类函数

“SQLAlchemy”类中未解析的属性“Column”