質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

714閲覧

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

NCC1701

総合スコア1680

ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2024/01/06 03:29

実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

https://zenn.dev/alcnaka/articles/1eca6622f121ed

ここの記述を参考にして、以下のようなの追加すると私の所では上手くいきました。

python

1engine = sqlalchemy.create_engine(f'sqlite:///{DATABASE}', echo=False) 2 3import unicodedata 4@sqlalchemy.event.listens_for(Base.metadata, "column_reflect") 5def column_reflect(inspector, table, column_info): 6 column_info['key']=unicodedata.normalize('NFKC', column_info['name']) 7 8Base.prepare(engine, reflect=True) 9

如何でしょうか。

検証補足

normalizeの内容は
https://note.nkmk.me/python-str-convert-full-half-width/
のようなので

全角数字、半角数字、全角英字、半角英字、全角カタカナ、半角カタカナ、漢字
で確認してみましたが、問題なく登録できました。

また、元々のコードのままだと半角カタカナもエラーで登録できませんでした。

投稿2024/01/06 05:11

編集2024/01/06 05:43
xail2222

総合スコア1506

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NCC1701

2024/01/06 13:46

ありがとうございました。うまくいきました。 正規化には思いつかずよい勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問