2014-01-18 38 views
6

我有一個數據庫,我沒有元數據或orm類(數據庫已經存在)。插入並更新核心SQLAlchemy

我設法選擇的東西被工作:

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模型插入或更新?

回答

22

正如您從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) 
+0

搜索2天后發現大多數還反正坦克爲clearint它爲我 – Jester

+0

爲什麼會話而不是事務?從文檔中,會話應該與ORM一起使用,對嗎? – Aidis