2017-07-05 3 views
0

SQL Alchemyコアを使用する場合、バックエンドデータベース間のカラム名の変更によるエラーを回避するにはどうすればよいですか?私はバックエンドを制御せず、それらに書き込む必要はありません。データを選択して値を調べたいだけです。SQLAlchemyのコア - ResultProxyで大文字小文字を区別しないwrtスキーマの列名を作成する方法は?

create table foo(bar int)と言ってください。または類似のもの。 SQL Serverではcreate table FOO(BAR int)

select * from FOOを実行します。これは、Oracle、Postgres、およびMS SqlServerで正常に動作します。

しかし、PostgresとOracleは、print(row.bar)の場合はsqlalchemy.engine.result.RowProxyのインスタンスを返します。

SQL Serverはまったく同じクエリを使用して同じデータを返しますが、print(row.BAR)を使用する必要があります。

結果リストの各RowProxyは、フィールド名を_row属性の場所にマッピングする共有属性_keymapを使用します。この属性は、そのデータベース行のクエリによって返されたデータを持ちます。だから、

、タプル位置0は、バー、私ができる(この行っている){u'bar': (None, None, 0),u'BAR': (None, None, 0)}への変更を保持していることを言う_keymap {u'bar': (None, None, 0)}を、与えられました。

思っていなくて、その後print(row.bar)またはprint(row.BAR)私ができることを考えると、バックエンドのデータベースに格納barまたはBARか。

しかし、複数のデータベースエンジンに対してSQL Alchemyを使用する場合、列の上位/下位のスキーマ名を抽象化することはかなり一般的な問題です。一般的には非常に有能であるようです。

私は何かを見逃しましたか?組み込みの方法はありませんか?

これはraw SQLを使用するSQL Alchemyです。つまり、my appはクエリをプレーンなSQLとしてビルドします。私はORMを使用することはできません、それは全く範囲外です。また、データベースのバックエンドの設定を上位または下位の名前を使用するよう調整することもできません。私はそれらを制御しません。あなたはTrueに

create_engine(..., case_sensitive=False) 

case_sensitiveパラメータのデフォルト値を探しているかもしれない

答えて

1

。 Falseに設定すると、結果列は大文字と小文字を区別せずに一致します。

In [15]: engine = create_engine('sqlite://', case_sensitive=False) 

In [16]: metadata = MetaData() 

In [17]: metadata.bind = engine 

In [18]: tbl = Table('foo', metadata, Column('BAR', Text)) 

In [19]: metadata.create_all() 

In [22]: engine.execute(tbl.insert().values([('asdf',), ('qwer',)])) 
Out[22]: <sqlalchemy.engine.result.ResultProxy at 0x7f03b4ba6b00> 

In [23]: row = engine.execute(tbl.select()).fetchone() 

In [24]: row 
Out[24]: ('asdf',) 

In [25]: row.BAR 
Out[25]: 'asdf' 

In [26]: row.BaR 
Out[26]: 'asdf' 

In [27]: row.bar 
Out[27]: 'asdf' 
+0

このタイプのものが属する* create_engine *オプションを確認する必要があります。私の回帰テストはそれが働いていることを示し、どんな場合でも、私が求めていた基本的な使い方はあなたの推薦でうまくいきます。 Txs! –

関連する問題