2017-07-30 13 views
0

を反映してマッピングされていないmissing_adverisersが(それはこの質問のために重要ではありません)パンダDataFrameあるSQLAlchemyのは、私はこのコードを持っているクラス

advertisers = advertiser_table(engine) 
... 
session.bulk_insert_mappings(
     advertisers.name, 
     missing_advetisers.to_dict('records'), 
    ) 

エラーこれは私を与えるには、次のとおりです。

sqlalchemy.orm.exc.UnmappedClassError: Class ''advertiser'' is not mapped 

ドキュメントを読んでから、私はそれよりもはるかに多くの質問をするのに十分なスクランブルが、ことができませんでした...何Mapperで、なぜそれがにとても有害ですなぜこのクラスはマップされていないのですか?明らかに、この図書館がマップしたいと思っているものに "マップ"するために私は何をすべきですか?

答えて

4

Mapperは、ORMのMです。あなたのテーブル(ここではadvertisers)をクラスのインスタンス(この場合はあなたが不足しているインスタンス)にマッピングして、操作することができます。

SQLAlchemyは実際にはSQLAlchemy Coreと呼ばれ、SQLAlchemy ORMはSQLAlchemyが実際には2つのライブラリであるためです。 Coreはテーブルを操作し、行のを返すクエリを構築する機能を提供します.ORMはCoreの上に構築され、抽象クラスとしてのクラスとその関係を扱うことができます。コアはおおよそConnectionEngineで行うことができますが、ORMはおおよそSessionで行うことができます。

つまり、session.bulk_insert_mappingsはORM機能であり、マッピングされたクラスを使用せずに使用することはできません。

代わりに何ができますか?

query = advertisers.insert().values(missing_advetisers.to_dict('records')) 
engine.execute(query) # or session.execute(query) 

あるいはパンダ-提供to_sql機能を使用します:同等のコア機能を使用し

missing_advetisers.to_sql("advertiser", engine, if_exists="append") 

をあなたはORMを使う、という場合は、あなたがあなたのテーブルにマップクラスを宣言する必要があります。反射を使用する場合の最も簡単な方法は、automapを使用することです。リンクされたドキュメントには多くの例がありますので、ここでは詳しく説明しません。

+0

申し訳ありませんが、私の前のコメントが赤い場合:「実行」部分を忘れました。今はすべて良いです。 – wvxvw

関連する問題