7

私は使用しています:

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

錬金術で挿入呼び出しから PK を取得しようとしています。

次のようにエンジンを取得します。

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

db = SQLAlchemy(app)

アプリで挿入クエリを実行します。

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

inserted_primary_keyしかし、プロパティにアクセスしようとすると、次のようになります。

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

私の場合、implicit_returning を有効にする方法、ドキュメントを読んでも役に立ちませんか?

4

3 に答える 3

5

RETURNING句を使用して、これを自分で処理できます。

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

その後、通常はクエリから値を取得するので、ID を取得できます。

これは Postgres では機能しますが、MySQL や sqlite などの他のデータベース エンジンでは機能しないことに注意してください。

ORM機能を使用せずにSQLAlchemy内でこれを行うdbに依存しない方法はないと思います。

于 2013-07-20T17:30:00.913 に答える
4

通常の sqlalchemy insert() の代わりにテキスト クエリを実行する理由はありますか? sqlalchemy を使用している場合は、クエリを次のように言い換えると、おそらくはるかに簡単になります。

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] 

このようにして、sqlalchemy がバインディングを行います。

于 2013-07-20T12:20:11.403 に答える
1

lastrowid を使用できます

rv = query()
rv.lastrowid
于 2016-09-27T08:46:14.620 に答える