Entendiendo MetaData () de SQLAlchemy en Python

Estoy tratando de entender en qué consiste esencialmente el objeto creado por MetaData (). Se utiliza al reflejar y crear bases de datos en Python (usando el paquete SQLAlchemy).

Considere el siguiente código de trabajo:

/ con el motor precargado (sqlite: ///chapter5.sqlite) y metadata = MetaData (): cuando llamo a los metadatos en la consola, devuelve ‘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) 

Por supuesto, al escribir type (metadata) obtengo exactamente qué tipo de metadata de objeto es: sqlalchemy.sql.schema.MetaData. En la documentación de SQLAlchemy está escrito.

MetaData es un objeto contenedor que mantiene unidas muchas características diferentes de una base de datos (o múltiples bases de datos) que se describen.

Sin embargo, estoy confundido, porque en el código solo creamos una tabla que “apunta” a los metadatos. Después de eso, cuando llamamos al método create_all en los metadatos (vacío por mucho), apuntando a la base de datos (que es señalada por el motor).

Probablemente mi pregunta es tonta, pero:

¿Cómo Python conecta exactamente estas instancias? Probablemente la statement de la tabla del censo vincula los metadatos a los nombres de las columnas de forma bilateral.


Nota: El código es de un ejercicio del curso datacamp .

Creo que preguntaste cómo Python (SQLAlchemy te refieres a) conecta la tabla con los metadatos y los metadatos con la base de datos y el motor.

Por lo tanto, las tablas de base de datos en SQLAlchemy pertenecen (están vinculadas a) un objeto de metadatos. La tabla se agrega a los metadatos; hay una propiedad de tablas en el objeto de metadatos que se parece mucho a una lista:

rue, nullable = False), Column (‘host_id’, Integer (), ForeignKey (‘slots.id’), table =, nullable = False), Column (‘active’, Boolean (), table =), Col umn (‘puerto’, Entero (), tabla =, nullable = Falso), Columna (‘descripción’, Cadena (longitud = 120), tabla =), Columna (‘nombre de usuario’, Cadena (longitud = 40), tab tab = ), Columna (‘contraseña’, Cadena (longitud = 40), tabla =), esquema = Ninguno), ‘network_location_associations’: Tabla (‘network_location_associations’, M etaData (bind = None), Columna (‘network_id’, Integer ( ), ForeignKey (‘networks.id’), table =), Column (‘location_id’, Integer (), ForeignKey (‘locations. Id’), table =), schema = None), ‘machines’: Table (‘ machines ‘, 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 (longitud = 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 = Falso), Columna (‘z_mm’, Flotador (), t able =, nullable = Falso), Columna (‘rotation_deg’, Flotador (), table =, nullable = Falso), Columna (’tilt_deg’, Flotador () tabla =, nullabl e = Falso), Columna (‘ro ll_deg’, Float (), table =, nullable = False), Column (‘on_floor’, Boolean (), table =, nullable = False), schema = None), ‘publicaddresses’ : Tabla (‘publicaddresses’, MetaData (bind = None), Column (‘id’, Integer (), table =, primary_key = True, nullable = False), Column (‘ip’, Integer (), table =, Nullable = Falso), C olumn (‘slot_id’, Integer (), ForeignKey (‘slots.id’), table =, nullable = False), schema = None), ‘connections’: Table (‘connections’, MetaData (bind = Ninguno), Columna (‘i d’, Integer (), table =, primary_key = True, nullable = False), Column (‘src_slot_id’, Integer (), ForeignKey (‘slots.id’), table =), Columna (‘src_index’, Inte ger (), table =), Columna (‘src_type’, Enum (‘HDMI’, ‘DisplayPort’, ‘miniDP’, ‘VGA’, ‘DVI’, ‘Power’, ‘CAT6’ , ‘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’, ‘CAT6’, ‘WallNet’, ‘Hybrid’, ‘Desconocido Video ‘), table =), schema = None),’ types ‘: Table (‘ types ‘, MetaData (bind = None), Column (‘ type ‘, Integer (), table =, primary_key = True, nullable = False ), Columna (‘nombre’, Cadena (longitud = 60), tabla =), esquema = Ninguno), ‘roles’: Tabla (‘roles’, MetaData (bind = No ne), Columna (‘id’, Entero ( ), table =, primary_key = True, nullable = False), Column (‘name’, String (), table =, nullable = False), Column (‘description’, String (), table =, nullable = False), Columna (‘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 =), Columna (‘nombre’, Cadena (longitud = 50), tabla =), Columna (‘x_mm’, Flotador (), tabla =, nullable = Falso), Columna (‘y_mm’, Flotador (), tabla = , anulable = F alse), Columna (‘z_mm’, Flotador (), tabla =, nullable = Falso), Columna (‘rotation_deg’, Flotante (), tabla =, nullable = Falso), Columna (‘widt h_mm ‘, Float (), table =, null able = False), Column (‘ height_mm ‘, Float (), table =, nullable = False), Column (‘ depth_mm ‘, Float (), table =, nullable = False ), Columna (‘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 (‘formacion’, Enum (‘2×3’, ‘1×2’, ‘ 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’, Intege r (), tabla =), Columna (‘ip_wlan’, Entero (), tabla =), Columna (‘opcional’, Booleano (), tabla =), Columna (‘notas’, Cadena (), tabla =), Columna (‘clasificación’, Enum (‘U’, ‘S’, ‘TS’), tabla =), Columna (‘os’, String (), tabla =), Columna (‘versión’, String (), tabla =), Columna (‘track’, String (), t able =), Column (‘uuid’, Binary (), table =), Column (‘displaydata’, String (), table =), schema = None) })

len () models.Base.metadata.tables Archivo “”, línea 1 len () models.Base.metadata.tables ^ SyntaxError: syntax no válida len (models.Base.metadata.tables) 22

La razón por la que necesita el objeto de metadatos es:

  • Tener una sola unidad de trabajo para crear y eliminar tablas relacionadas.

  • Tener un lugar para recoger todos los resultados de una operación de reflexión.

  • Para ordenar las tablas relacionadas según sus dependencias para que las restricciones de clave externa se puedan crear en el orden correcto.

Por lo tanto, el objeto de metadatos contiene SQLAlchemyidea de lo que cree que podría parecer una base de datos. Por lo general, se rellena desde la reflexión o desde la creación de objetos de tabla (posiblemente a través de la extensión declarativa base).

Puede asociar directamente un objeto de metadatos con un motor de base de datos real configurando el parámetro de enlace en el constructor de metadatos. Alternativamente, puede hacer el enlace cuando utiliza los metadatos en crear llamadas o en llamadas de reflexión.