2017-05-27 12 views
0
s = select([stations.c.name]).where(stations.c.name == station_name) 
stations = connection.execute(s).fetchone() 

SQLテーブルでSELECTを実行する上記のコードがあります。一致したエントリの他の列がアクセス可能であったが、局による主キー列[「ID」]をアクセスしようとするとエラーを与える:Python SQLAlchemy - SELECTステートメントの結果の主キー列にアクセスできない

"Could not locate column in row for column 'id'" 

それはなぜですか?

表の定義:

stations = Table('stations', metadata, 
     Column('id', Integer, primary_key = True), 
     Column('name', String(16), nullable = False) 
     ) 
+2

['Table'](http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Table)オブジェクト定義 –

+0

をここに追加してください。 – StephenChen

+0

[RDBMS](https://en.wikipedia.org/wiki/Relational_database_management_system)はあなたが使っていますか? –

答えて

3

:あなたは

stations = connection.execute(s).fetchone() 

初期stationsTable対象文の後ので、あなたのケースで異なるオブジェクトに同じ名前を与えないようにする必要がありはアクセスできなくなります。フェッチされたオブジェクトの名前をstation_recordに変更するか、stationsTableオブジェクトの名前をstations_tableに変更するか、またはその両方に変更できます。あなたは、レコードのidを取得したい場合は


回答

- あなたはそれを照会するよりも:

s = select([stations.c.id, stations.c.name]).where(stations.c.name == station_name) 

または

s = select(stations.columns).where(stations.c.name == station_name) 

を最後に、我々は

のようなものを持つことができます
from sqlalchemy import MetaData, Table, Column, Integer, String, create_engine, select 

db_uri = 'sqlite://' 
engine = create_engine(db_uri) 
metadata = MetaData(bind=engine) 
stations = Table('stations', metadata, 
       Column('id', Integer, primary_key=True), 
       Column('name', String(16), nullable=False) 
       ) 
stations.create(checkfirst=True) 
connection = engine.connect() 
station_name = 'sample text' 
connection.execute(stations.insert().values(name=station_name)) 
s = select(stations.columns).where(stations.c.name == station_name) 
station_record = connection.execute(s).fetchone() 
station_record_id = station_record['id'] 
station_record_name = station_record['name'] 
+0

実行中のステーション['id']でも同じエラーが表示されます(ただしステーション['name']はありません)。主キー列にアクセスできない理由が分かりますか? – StephenChen

+0

@StephenChen:固定アンサー –

関連する問題