【问题标题】:Insert and update with core SQLAlchemy使用核心 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 模型的情况下构造插入或更新?

【问题讨论】:

    标签: python sql-server python-3.x sqlalchemy


    【解决方案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 一起使用,对吧?
    猜你喜欢
    • 1970-01-01
    • 2016-06-24
    • 2011-05-05
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    相关资源
    最近更新 更多