SQLAlchemy のカラム名に全角英数字がある場合のTypeError

実現したいこと

SQLiteに全角英数字を含むカラム名があるとき、エラーを出さずにデータを追加したい
(カラム名には「明細ID」や「詳細1」のように全角英数字が含まれている)

元のカラム名を変更せずに対処する方法を教えてください。
SQLAlchemyで問題解決できなければ、他のORMライブラリでも構いません。

発生している問題・分からないこと

TypeError: '明細ID' is an invalid keyword argument for mydata
のエラーが出ます。
全角英数字で指定しているカラム名が半角英数字に変換されてしまっているもよう(変換されないようにするためにはどうすればよいか)

エラーメッセージ

error

1Traceback (most recent call last): 2... 3 File "/opt/homebrew/Caskroom/miniconda/base/envs/3_10_6/lib/python3.10/site-packages/sqlalchemy/orm/state.py", line 481, in _initialize_instance 4 with util.safe_reraise(): 5 File "/opt/homebrew/Caskroom/miniconda/base/envs/3_10_6/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__ 6 compat.raise_( 7 File "/opt/homebrew/Caskroom/miniconda/base/envs/3_10_6/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 208, in raise_ 8 raise exception 9 File "/opt/homebrew/Caskroom/miniconda/base/envs/3_10_6/lib/python3.10/site-packages/sqlalchemy/orm/state.py", line 479, in _initialize_instance 10 return manager.original_init(*mixed[1:], **kwargs) 11 File "/opt/homebrew/Caskroom/miniconda/base/envs/3_10_6/lib/python3.10/site-packages/sqlalchemy/orm/decl_base.py", line 1163, in _declarative_constructor 12 raise TypeError( 13TypeError: '明細ID' is an invalid keyword argument for mydata

該当のソースコード

Python

1DATABASE = os.path.expanduser('mydata.sqlite')2Base = automap_base()3engine = sqlalchemy.create_engine(f'sqlite:///{DATABASE}', echo=False)4Base.prepare(engine, reflect=True)5Mydata = Base.classes.mydata 6session = Session(bind = engine)7records = []8for record in csv_dict:9 records.append(Mydata(10 明細ID = record['明細ID'], #<- 全角英字のカラム名、ここでエラーになる11 金額 = record['金額'],12 詳細1 = record['詳細1'], #<- 全角数字のカラム名、ここでエラーになる13 詳細2 = record['詳細2'])), #<- 全角数字のカラム名、ここでエラーになる14session.add_all(records)15session.commit()16 17# csv_dictは次のようなdictのlistです18# {'明細ID': '20001205002', '金額': 165, '詳細1': '手数料', '詳細2': ''}19

試したこと・調べたこと

上記の詳細・結果

「python sqlalchemy カラム名に全角英数字」で検索しても同様の問題が見つかりません
「明細ID」をシングルクウォート、ダブルクウォート、バッククウォートで囲ってみたり、全角英数字の前にバックスラッシュ(エスケープ)を入れたりしたけど、だめでした。

補足

python 3.10.6
SQLAlchemy 1.4.39

コメントを投稿

0 コメント