使用 SQLAlchemy 生成数据库模式 [重复]
Posted
技术标签:
【中文标题】使用 SQLAlchemy 生成数据库模式 [重复]【英文标题】:Generate database schema using SQLAlchemy [duplicate] 【发布时间】: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 看起来会略有不同)?
【问题讨论】:
【参考方案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.add
和 session.add_all
时,是否有生成原始 sql 的方法?
请注意,如果您想查看用于创建表和插入数据的原始 sql,可以将 echo=True
作为参数添加到 create_engine
。以上是关于使用 SQLAlchemy 生成数据库模式 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
SQLAlchemy中的PostgreSQL RAW查询[重复]
我可以让 SQLAlchemy 在不重复完整原始查询的情况下进行子查询预加载吗?