【问题标题】:Generate database schema using SQLAlchemy [duplicate]使用 SQLAlchemy 生成数据库模式 [重复]
【发布时间】:2019-05-06 12:26:34
【问题描述】:

我有一个非常简单的一对多数据库模式(父母可以有很多孩子,但孩子只能有一个父母)。我的 SQLAlchemy 模型如下所示:

from sqlalchemy import Table, Column, Integer, ForeignKey
from sqlalchemy.orm import relationship

from models import Base

class Parent(Base):
    __tablename__ = 'Parent'
    id = Column(Integer, primary_key=True)
    children = relationship('Child', backref='parent')

class Child(Base):
    __tablename__ = 'Child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('Parent.id'))

我可以使用以下命令在数据库中创建表:

engine = create_engine('mysql://localhost:3306/testdb')
Base.metadata.create_all(engine)

我很好奇创建这些表的原始 SQL 是什么样的。我想它看起来像这样,但我想确定:

CREATE TABLE Parent (
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (id)
);

CREATE TABLE Child (
    id INT NOT NULL AUTO_INCREMENT,
    parent_id int,
    PRIMARY KEY (id),
    CONSTRAINT FK_Parent FOREIGN KEY (parent_id) REFERENCES Parent(id)
);

有没有使用 SQLAlchemy 在原始 sql 中生成数据库模式?我知道我可以生成query in raw sql,但我想知道如何生成初始数据库架构。

除此之外,是否有根据实际数据库类型生成架构的方法(例如,对于 MySQL 和 PostgreSQL,原始 sql 看起来会略有不同)?

【问题讨论】:

    标签: python mysql sql sqlalchemy


    【解决方案1】:

    how-can-i-get-the-create-table-drop-table-output-as-a-string

    from sqlalchemy import MetaData, Table, Column, Integer, String
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.schema import CreateTable
    import sqlalchemy
    print(sqlalchemy.__version__)
    
    Base = declarative_base()
    
    class Parent(Base):
        __tablename__ = 'Parent'
        id = Column(Integer, primary_key=True)
        children = Column(String(255))
    
    user = Table('users', MetaData(bind=None),
                Column('id', Integer(), primary_key=True, nullable=False),
                Column('name', String()),
                Column('fullname', String()),
                Column('password', String()), schema=None)
    
    print(CreateTable(Parent.__table__))
    print(CreateTable(user))
    

    输出:

    1.3.0b1
    
    CREATE TABLE "Parent" (
        id INTEGER NOT NULL, 
        children VARCHAR(255), 
        PRIMARY KEY (id)
    )
    
    CREATE TABLE users (
        id INTEGER NOT NULL, 
        name VARCHAR, 
        fullname VARCHAR, 
        password VARCHAR, 
        PRIMARY KEY (id)
    )
    

    【讨论】:

    • 非常感谢!后续问题:当我创建 session.addsession.add_all 时,是否有生成原始 sql 的方法?
    • 请注意,如果您想查看用于创建表和插入数据的原始 sql,可以将 echo=True 作为参数添加到 create_engine
    猜你喜欢
    • 2017-09-30
    • 1970-01-01
    • 2011-09-20
    • 2013-05-27
    • 2017-05-21
    • 2018-03-10
    • 2021-03-27
    • 2012-03-27
    • 1970-01-01
    相关资源
    最近更新 更多