使用 SQLAlchemy 生成数据库架构

Joh*_*etz 4 python mysql sql sqlalchemy

我有一个非常简单的一对多数据库模式(父级可以有多个子级,但子级只能有一个父级)。我的 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'))
Run Code Online (Sandbox Code Playgroud)

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

engine = create_engine('mysql://localhost:3306/testdb')
Base.metadata.create_all(engine)
Run Code Online (Sandbox Code Playgroud)

我很好奇创建这些表的原始 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)
);
Run Code Online (Sandbox Code Playgroud)

有没有办法使用 SQLAlchemy 在原始 sql 中生成数据库模式?我知道我可以在原始 sql 中生成查询,但我想知道如何生成初始数据库模式。

最重要的是,是否有办法根据实际数据库类型生成模式(例如,对于 MySQL 和 PostgreSQL,原始 sql 看起来会略有不同)?

KC.*_*KC. 6

我如何获取创建表删除表输出作为字符串

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))
Run Code Online (Sandbox Code Playgroud)

输出:

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)
)
Run Code Online (Sandbox Code Playgroud)