2013-07-20 23 views
6

yürütün:db.engine.connect gelen inserted_primary_key almak nasıl() kullanıyorum çağrıyı

CPython 2.7.3, 
Flask==0.10.1 
Flask-SQLAlchemy==0.16 
psycopg2==2.5.1 
and 
postgresql-9.2 

simya ile insert çağrısından PK almaya çalışıyorum. şöyle

Alma motoru: app

app = Flask(__name__) 
app.config.from_envvar('SOME_VAR') 
app.wsgi_app = ProxyFix(app.wsgi_app) # Fix for old proxyes 

db = SQLAlchemy(app) 

Ve yürütme insert sorgusu:

from sqlalchemy import text, exc 
    def query(): 
     return db.engine.connect().execute(text(''' 
     insert into test...'''), kw) 
    rv = query() 

Ama erişim inserted_primary_key özelliği çalışırken, olsun:

InvalidRequestError: Statement is not an insert() expression construct. 

yılında implicit_returning etkinleştirme Benim durumum, dokümanlar okumak yardımcı olmuyor mu?

cevap

4

Sen RETURNING maddesini kullanmak ve bu kendini işleyebilir:

INSERT INTO test (...) VALUES (...) RETURNING id 

Sonra kimliği alabilirsiniz normalde sorgularından değerleri almak olarak.

Bunun Postgres üzerinde çalıştığını, ancak MySQL veya sqlite gibi diğer db motorlarda çalışmadığını unutmayın.

Bunu, ORM işlevini kullanmadan SQLAlchemy içinde yapmak için bir db agnostic yol olduğunu düşünmüyorum.

+1

mysql - sonuç.lastrowid – Sviatoslav

+0

için teşekkürler Postgresql kullanıyorum, her şeyi denedim, '(işe yaramaz, her zaman 0'a dönersiniz), çözümünüz benim için çalışan tek çözümdür – Neekey

+0

Bu, kırmızıya kayma ile çalışacak mı? –

2

Normal sqlalchemy insert() yerine metin sorgulamanızın herhangi bir nedeni var mı? sizin için bağlayıcı yapacak

from sqlalchemy import text, exc, insert 

# in values you can put dictionary of keyvalue pairs 
# key is the name of the column, value the value to insert 
con = db.engine.connect() 
ins = tablename.insert().values(users="frank") 
res = con.execute(ins) 
res.inserted_primary_key 
[1] 

Bu şekilde sqlalchemy: Eğer SQLAlchemy kullanıyorsanız, Sorgunuzu ifadeleri değiştirmeye yönelik muhtemelen çok daha kolay olacaktır.

+0

Teşekkür kullanabilirsiniz ama ham SQL kullanmayı tercih ediyorum. 'Implicit_returning = Gerçek motor kw'yi flask-sqlalchemy'e sokmanın bir yolu var mı? – greggyNapalm

+0

Ham sql kullanırsanız nasıl alacağınızdan emin değilim, ancak simya insert() yaparsanız, sorun değil, bunu göstermek için cevabımı düzenledim. –

+2

Ham SQL'i seviyorum ve şemayı ikinci kez python kodunda bildirmek istemiyorum. İstediğim her şey db.engine.connect() ile ekledikten sonra PK kimliğini alır. (Execute ('' 'raw sql buraya ekle' '' – greggyNapalm

0

Sen lastrowid

rv = query() 
rv.lastrowid 
İlgili konular