使用核心SQLAlchemy插入和更新

Jes*_*ter 11 python sql-server sqlalchemy python-3.x

我有一个数据库,我没有元数据或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)
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

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

session.execute(<Some sql>)
Run Code Online (Sandbox Code Playgroud)

我想这样做,所以我可以创建一个类,如:

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

seasion.execute(u)
Run Code Online (Sandbox Code Playgroud)

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

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

u = update("table")
u = u.values({"name": "test1"})
Run Code Online (Sandbox Code Playgroud)

我不能让它执行:

session.execute(i)
Run Code Online (Sandbox Code Playgroud)

要么

session.execute(u)
Run Code Online (Sandbox Code Playgroud)

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

van*_*van 29

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)
Run Code Online (Sandbox Code Playgroud)

  • 为什么是会话而不是事务?从文档来看,会话应该与 ORM 一起使用,对吗? (3认同)