使用核心 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 构建有两层:ORM
和 Core
。目前,您仅使用 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)