我试图理解MetaData()创建的对象本质上是什么。在Python中反映和创建数据库时使用它(使用SQLAlchemy包)。
考虑以下工作代码:
/预加载引擎(sqlite:///chapter5.sqlite)和metadata = 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)
当然,通过输入类型(元数据),我得到了对象元数据的确切类型:sqlalchemy.sql.schema.MetaData。在SQLAlchemy documentation中写了
MetaData是一个容器对象,它将所描述的数据库(或多个数据库)的许多不同功能保持在一起。
但是,我很困惑,因为在代码中我们只创建一个“指向”元数据的表。之后,当我们在元数据上调用create_all方法(到目前为止为空)时,指向数据库(由引擎指向)。
可能我的问题很愚蠢,但是:
python如何完全连接这些实例?可能是人口普查表的声明以双向方式将元数据链接到列名。
注意:代码来自datacamp课程的练习。
答案 0 :(得分:4)
我想你问过python(你可能是SQLAlchemy的意思)如何将表连接到元数据,将元数据连接到数据库和引擎。
因此,SQLAlchemy中的数据库表属于(链接到)元数据对象。该表将自己添加到元数据中;元数据对象上有一个表属性,与列表非常相似:
rue,nullable = False),列(' host_id',Integer(),ForeignKey(' slots.id'),table =,nullable = False),列(& #39; active',Boolean(),table =),Col umn(' port',Integer(),table =,nullable = False),列('描述',字符串(长度= 120),表=),列(&#39 ; username',String(length = 40),tab le =),列('密码',字符串(长度= 40),表=),架构=无),' network_location_associations':表(' network_location_associations' ,M etaData(bind = None),列(' network_id',Integer(),ForeignKey(' networks.id'),table =),列(' location_id' ,Integer(),ForeignKey('位置。 id'),table =),schema = None),' machines':表(' machines',MetaData(bind = None),列(' id&#) 39;,Integer(),ForeignKey(' items.id'),table =
,primary_key = True,nullable = False),列(' eth0',String(),table =),列(' eth1',String(),table =) ,列(' eth2',String(),table =),Colu mn(' eth3',String(),table =),列(' wlan0',String(),table =),列(' ipmi',String (),table =),schema = None),' machine_profiles':表(' mach ine_profiles',MetaData(bind = None),列(' id',Integer(),table =,primary_key = True,nullable = False),列(' DisplayPort',整数(),表=),列(' HDMI',整数(),表=),列(' RAM',字符串(长度= 10),表=),模式=无),'几何':表格(' geometry',MetaData(b) ind = None),Column(' slot_id',Integer(),ForeignKey(' slots.id'),table =,primary_key = True,nullable = False),列(&# 39; room_id',Integer(),ForeignKey(' rooms.id'),tabl e =,nullable = False),列(' x_mm',Float(),table =,nullable = False),列(' y_mm',Float(),table =,nullable = False),列(' z_mm',Float(),t able =,nullable = False),列(' rotation_deg',Float(),table =,nullable = False),列(' tilt_deg',Float(),table =,nullable = False),列(' ro ll_deg',Float(),table =,nullable = False),列(' on_floor',Boolean(),table =,nullable = False),schema = None),' publicaddresses& #39;:表格(' 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' :表格('连接',MetaData(绑定=无),列(' i d',Integer(),table =,primary_key = True,nullable = False),列(' src_slot_id',Integer(),ForeignKey(' slots.id'), table =),Column(' src_index',Inte ger(),table =),列(' src_type',枚举(' HDMI',' DisplayPort',' miniDP',&# 39; VGA',' DVI',' Power',' CAT6',' WallNet'' Hybrid&#39 ;,' UnknownVideo'),table = ),列(' dst_slot_id',Integer(),ForeignKey(' slots.id'),table =),列(' dst_index',Integer(), table =),列(' dst_type',枚举(' HDMI','显示) yPort',' miniDP',' VGA',' DVI',' Power',' CAT6', ' WallNet',' Hybrid',' UnknownVideo'),table =),schema = None),' types':Table(' 39;类型',MetaData(绑定=无),列 (' type',Integer(),table =,primary_key = True,nullable = False),列(' name',String(length = 60),table =),schema =无),'角色':表('角色',MetaData(绑定=否) ne),Column(' id',Integer(),table =,primary_key = True,nullable = False),列(' name',String(),table =,nullable = False),列('描述',String(),table = ,nullable = False),列(' display_driver',Boolean(),table =,nullable = False),schema = None),' rooms':Table(' rooms& #39;,MetaData(bind = None),列(' id',Integer( ),table =,primary_key = True,nullable = False),列(' location_id',Integer(),ForeignKey(' locations.id'),table =,nullable = False) ,列(' parent_id',整数( ),table =),列('名称',字符串(长度= 50),表格=),列(' x_mm',Float(),table =,nullable = False) ,列(' y_mm',Float(),table =,nullable = F. alse),列(' z_mm',Float(),table =,nullable = False),列(' rotation_deg',Float(),table =,nullable = False),列(' width_mm',Float(),table =,null able = False),列(' height_mm',Float(),table =,nullable = False),列(' depth_mm',Float(),table =,nullable = False) ,列(' has_workstations',Boolean(),ta ble =,nullable = False),schema = None),'显示':表('显示',MetaData(绑定=无),列(' id' ,Integer(),table =,primary_key = True,nullable = False),Co lumn('主机名',字符串(长度= 100),表=),列('形成',枚举(' 2x3',' 1x2&# 39;,' corkboard',桌面'桌面共享'),table =,nullable = False),s chema =无),'插槽':表格('插槽',MetaData(绑定=无),列(' id',整数(),表=, primary_key = True,nullable = False),Column(' location_id',Integer(),ForeignKe y(' locations.id'),table =,nullable = False),列('主机名',字符串(),表=),列(' item_id&#39 ;,Integer(),ForeignKey(' items.id'),table =),列(' r ole_id',Integer(),ForeignKey(' roles.id'),table =),列(' parent_id',Integer(),ForeignKey(' slot。 id'),table =),列(' ip',Integer(),table =),Col umn(' ip_ipmi',Integer(),table =),列(' ip_wlan',Integer(),table =),列('可选',布尔值(),table =),列(' notes',String(),table =), 专栏('分类',Enum(' U'' S',' TS'),表=),列(&#39 ; os',String(),table =),Column(' release',String(),table =),Column(' track',String(),t able =),列(' uuid',Binary(),table =),列(' displaydata',String(),table =),schema = None)})
LEN()models.Base.metadata.tables 文件"",第1行 LEN()models.Base.metadata.tables ^ SyntaxError:语法无效 LEN(models.Base.metadata.tables) 22
您需要元数据对象的原因是:
创建和删除相关表格的单一工作单元
有一个地方收集反射操作的所有结果
根据依赖关系对相关表进行排序,以便按正确的顺序创建外键约束。
因此,元数据对象包含SQLAlchemy,它认为数据库可能是什么样子。它通常来自反射或您创建表对象(可能通过声明性基本扩展)。
您可以通过在元数据构造函数中设置bind参数,直接将元数据对象与实际数据库引擎相关联。或者,您可以在创建调用或反射调用中使用元数据时建立链接。