2014-01-18 10 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は2つのレイヤー、すなわちORMCoreでビルドされています。現在、Coreのいくつかの構造体しか使用せず、すべてを手動で構築しています。

Coreを使用するには、SQLAlchemyにデータベースに関するいくつかのメタ情報を知らせる必要があります。以下のコードは、あなたが必要とするすべてのタスクを実行する必要があり、あなたが列field1, field2, field3と定義されてprimary keyでテーブルmytableを持っていると仮定すると:

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

セッションとトランザクションではない理由docsから、セッションはORMで使用する必要があります。 – Aidis

関連する問題