2013-07-20 13 views
6

Używam:Jak zdobyć inserted_primary_key z db.engine.connect() wykonać połączenia

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

Próbuje PK z połączenia wkładki z alchemią.

Pierwsze silnik tak:

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

db = SQLAlchemy(app) 

i wykonywanie zapytań insert w aplikacji:

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

Ale próbuje Dostęp inserted_primary_key nieruchomości, otrzymujemy:

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

Jak włączyć implicit_returning w mój przypadek, czytanie dokumentów nie pomaga?

Odpowiedz

4

Można użyć klauzuli RETURNING i obsługiwać ten sam:

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

Następnie można pobrać identyfikator jak zwykle pobierać wartości z zapytaniami.

Należy zauważyć, że działa to na PostgreSQL, ale nie działa w innych silnikach baz danych, takich jak MySQL lub sqlite.

Nie sądzę, że istnieje sposób agnostyczny na db w tym celu w SQLAlchemy bez użycia funkcji ORM.

+1

Dla mysql - result.lastrowid – Sviatoslav

+0

Dzięki, używam Postgresql, próbowałem wszystkiego, jak 'lastrowid '(nie działa, zawsze zwraca 0), twoje rozwiązanie jest jedyne, które działa dla mnie – Neekey

+0

czy to zadziała z Redshift? –

2

Czy istnieje jakikolwiek powód, dla którego wykonujesz zapytanie tekstowe zamiast zwykłej wstawki sqlalchemy()? Jeśli używasz SQLAlchemy prawdopodobnie będzie to znacznie łatwiejsze do rephrase zapytanie na:

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] 

ten sposób SQLAlchemy zrobi wiązania dla Ciebie.

+0

Dzięki, ale wolę używać surowego SQL. Czy istnieje sposób, aby przesunąć "implicit_returning = True engine kw" na flask-sqlalchemy? – greggyNapalm

+0

Nie jestem pewien, jak można go uzyskać, jeśli używasz raw sql, ale jeśli robisz alchemy insert(), działa dobrze, edytowałem odpowiedź, aby to pokazać. –

+2

Lubię surowego SQL i nie chcę deklarować mojego schematu po raz drugi w kodzie Pythona. Wszystko, co mogę uzyskać, to identyfikator PK po wstawieniu z db.engine.connect(). Execute ('' 'raw sql insert here' '' – greggyNapalm

0

Można użyć lastrowid

rv = query() 
rv.lastrowid