実現したいこと
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
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
「python sqlalchemy カラム名に全角英数字」で検索しても同様の問題が見つかりません
「明細ID」をシングルクウォート、ダブルクウォート、バッククウォートで囲ってみたり、全角英数字の前にバックスラッシュ(エスケープ)を入れたりしたけど、だめでした。
補足
python 3.10.6
SQLAlchemy 1.4.39
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/01/06 13:46