web-dev-qa-db-ja.com

PythonでのSQLAlchemyからのMetaData()の理解

MetaData()で作成されたオブジェクトが本質的に何であるかを理解しようとしています。 Python(SQLAlchemyパッケージを使用)でデータベースを反映および作成するときに使用されます。

次の作業コードを検討してください。

/プリロードされたEngine(sqlite:///chapter5.sqlite)とメタデータ= MetaData()を使用:コンソールでメタデータを呼び出すと、「MetaData(bind = None)」を返します/

# Import Table, Column, String, and Integer
from sqlalchemy import Table, Column, String, Integer

# Build a census table: census
census = Table('census', metadata,
               Column('state', String(30)),
               Column('sex', String(1)),
               Column('age', Integer()),
               Column('pop2000', Integer()),
               Column('pop2008',Integer()))

# Create the table in the database
metadata.create_all(engine)

もちろん、type(metadata)と入力すると、sqlalchemy.sql.schema.MetaDataというオブジェクトメタデータの種類が正確にわかります。 SQLAlchemyドキュメント に記述

MetaDataは、記述されているデータベース(または複数のデータベース)のさまざまな機能をまとめて保持するコンテナオブジェクトです。

ただし、コードではメタデータを「指す」テーブルのみを作成するため、混乱しています。その後、メタデータ(はるかに空)でcreate_allメソッドを呼び出すと、データベース(エンジンが指す)を指します。

おそらく私の質問はばかげていますが、

pythonこれらのインスタンスを正確に接続するにはどうすればよいですか?おそらく、国勢調査テーブルの宣言は、メタデータを両側の方法で列名にリンクしています。


注:コードは datacamp コースの練習問題です。

13
Veliko

python(おそらくあなたが意味するSQLAlchemy)がテーブルをメタデータに接続し、メタデータをデータベースとエンジンに接続する方法を尋ねたと思います。

したがって、SQLAlchemyのデータベーステーブルはメタデータオブジェクトに属します(リンクされます)。テーブルがメタデータに追加されます。メタデータオブジェクトには、リストのように機能するテーブルプロパティがあります。

rue、nullable = False)、Column( 'Host_id'、Integer()、ForeignKey( 'slots.id')、table =、nullable = False)、Column( 'active'、Boolean()、table =)、Col umn ( 'port'、Integer()、table =、nullable = False)、Column( 'description'、String(length = 120)、table =)、Column( 'username'、String(length = 40)、tab le = )、Column( 'password'、String(length = 40)、table =)、schema = None)、 'network_location_associations':Table( 'network_location_associations'、M etaData(bind = None)、Column( 'network_id'、Integer( )、ForeignKey( 'networks.id')、table =)、Column( 'location_id'、Integer()、ForeignKey( 'locations。id')、table =)、schema = None)、 'machines':Table( ' machine '、MetaData(bind = None)、Column(' id '、Integer()、ForeignKey(' items.id ')、table =

、primary_key = True、nullable = False)、Column( 'eth0'、String()、table =)、Column( 'eth1'、String()、table =)、Column( 'eth2'、String()、table = )、Colu mn( 'eth3'、String()、table =)、Column( 'wlan0'、String()、table =)、Column( 'ipmi'、String()、table =)、schema = None)、 'machine_profiles':Table( 'mach ine_profiles'、MetaData(bind = None)、Column( 'id'、Integer()、table =、primary_key = True、nullable = False)、Column( 'DisplayPort'、Integer()、 table =)、Column( 'HDMI'、Integer()、table =)、Column( 'RAM'、String(length = 10)、table =)、schema = None)、 'geometry':Table( 'geometry'、 MetaData(b ind = None)、Column( 'slot_id'、Integer()、ForeignKey( 'slots.id')、table =、primary_key = True、nullable = False)、Column( 'room_id'、Integer()、ForeignKey ( 'rooms.id')、tabl e =、nullable = False)、Column( 'x_mm'、Float()、table =、nullable = False)、Column( 'y_mm'、Float()、table =、nullable = False)、Column( 'z_mm'、Float()、table =、nullable = False)、Column( 'rotation_deg'、Float()、table =、nullable = False)、Column( 'tilt_deg'、Float()、 table =、nullabl e = False)、Column( 'ro ll_deg'、Float()、table =、nullable = False)、Column( 'on_floor'、Boolean()、table =、nullable = False)、schema = None)、 'publicaddresses' :Table( 'publicaddresses'、MetaData(bind = None)、Column( 'id'、Integer()、table =、primary_key = True、nullable = False)、Column( 'ip'、Integer()、table =、nullable = False)、C olumn( 'slot_id'、Integer()、ForeignKey( 'slots.id')、table =、nullable = False)、schema = None)、 'connections':Table( 'connections'、MetaData(bind =なし)、Column( 'i d'、Integer()、table =、primary_key = True、nullable = False)、Column( 'src_slot_id'、Integer()、ForeignKey( 'slots.id')、table =)、 Column( 'src_index'、Inte ger()、table =)、Column( 'src_type'、Enum( 'HDMI'、 'DisplayPort'、 'miniDP'、 'VGA'、 'DVI'、 'Power'、 'C​​AT6' 、 'WallNet'、 'Hybrid'、 'UnknownVideo')、table =)、Column( 'dst_slot_id'、Integer()、ForeignKey( 'slots.id')、table =)、Column( 'dst_index'、Integer() 、table =)、Column( 'dst_type'、Enum( 'HDMI'、 'Displa yPort'、 'miniDP'、 'VGA'、 'DVI'、 'Power'、 'C​​AT6'、 'WallNet'、 'Hybrid'、 'わからないビデオ ')、table =)、schema = None)、' types ':Table(' types '、MetaData(bind = None)、Column(' type '、Integer()、table =、primary_key = True、nullable = False )、Column( 'name'、String(length = 60)、table =)、schema = None)、 'roles':Table( 'roles'、MetaData(bind = No ne)、Column( 'id'、Integer( )、table =、primary_key = True、nullable = False)、Column( 'name'、String()、table =、nullable = False)、Column( 'description'、String()、table =、nullable = False)、 Column( 'display_driver'、Boolean()、table =、nullable = False)、schema = None)、 'rooms':Table( 'rooms'、MetaData(bind = None)、Column( 'id'、Integer()、 table =、primary_key = True、nullable = False)、Column( 'location_id'、Integer()、ForeignKey( 'locations.id')、table =、nullable = False)、Column( 'parent_id'、Integer()、table =)、Column( 'name'、String(length = 50)、table =)、Column( 'x_mm'、Float()、table =、nullable = False)、Column( 'y_mm'、Float()、table = 、nullable = F alse)、Column( 'z_mm'、Float()、table =、nullable = False)、Column( 'rotation_deg'、Float()、table =、nullable = False)、Column( 'widt h_mm '、Float()、table =、nullable = False)、Column(' height_mm '、Float()、table =、nullable = False)、Column(' depth_mm '、Float()、table =、nullable = False )、Column( 'has_workstations'、Boolean()、ta ble =、nullable = False)、schema = None)、 'displays':Table( 'displays'、MetaData(bind = None)、Column( 'id'、Integer ()、table =、primary_key = True、nullable = False)、Co lumn( 'hostname'、String(length = 100)、table =)、Column( 'formation'、Enum( '2x3'、 '1x2'、 ' corkboard '、' desktop '、' desktop-shared ')、table =、nullable = False)、s chema = None)、' slots ':Table(' slots '、MetaData(bind = None)、Column(' id ' 、Integer()、table =、primary_key = True、nullable = False)、Column( 'location_id'、Integer()、ForeignKe y( 'locations.id')、table =、nullable = False)、Column( 'hostname' 、String()、table =)、Column( 'item_id'、Integer()、ForeignKey( 'items.id')、table =)、Column( 'r ole_id'、Integer()、ForeignKey( 'roles.id' )、table =)、Column( 'parent_id'、Integer()、ForeignKey( 'slots.id')、table =)、Column( 'ip'、Integer()、table =)、Col umn( 'ip_ipmi'、統合r()、table =)、Column( 'ip_wlan'、Integer()、table =)、Column( 'optional'、Boolean()、table =)、Column( 'notes'、String()、table =)、 Column( 'classification'、Enum( 'U'、 'S'、 'TS')、table =)、Column( 'os'、String()、table =)、Column( 'release'、String()、table =)、Column( 'track'、String()、table =)、Column( 'uuid'、Binary()、table =)、Column( 'displaydata'、String()、table =)、schema = None) })

len()models.Base.metadata.tablesファイル ""、1行目len()models.Base.metadata.tables ^ SyntaxError:無効な構文len(models.Base.metadata.tables)22

メタデータオブジェクトが必要な理由は次のとおりです。

  • 関連するテーブルを作成およびドロップするための単一の作業単位を持つには

  • リフレクション操作のすべての結果を収集する場所がある

  • 外部キー制約を正しい順序で作成できるように、依存関係に基づいて関連テーブルを並べ替えます。

したがって、メタデータオブジェクトには、データベースがどのように見えるかについてのSQLAlchemy'sideaが含まれています。通常、リフレクションから、またはテーブルオブジェクトの作成から(おそらく宣言ベースの拡張を通じて)データが入力されます。

メタデータコンストラクターでbindパラメーターを設定することにより、メタデータオブジェクトを実際のデータベースエンジンに直接関連付けることができます。または、メタデータを作成呼び出しまたはリフレクション呼び出しで使用するときにリンクを作成できます。

8
Sam Hartman