$ pip install sqlalchemy sqlalchemy-utils psycopg2 alembic
from sqlalchemy import create_engine, Table, Column, Integer, ForeignKey
from sqlalchemy.orm import relationship, backref
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
association_table = Table('association', Base.metadata,
Column('left_id', Integer, ForeignKey('left.id')),
Column('right_id', Integer, ForeignKey('right.id'))
)
class Left(Base):
__tablename__ = 'left'
id = Column(Integer, primary_key=True)
rights = relationship(
'Right',
secondary=association_table,
backref=backref('lefts', lazy='dynamic')
)
class Right(Base):
__tablename__ = 'right'
id = Column(Integer, primary_key=True)
engine = create_engine('postgres://localhost/mydatabase')
Base.metadata.create_all(engine)
$ alembic init alembic
# ...之前的代码
from alembic import context
# 新增如下两行
from sqlalchemy_utils import database_exists, create_database
# ...之后的代码
def run_migrations_offline():
# ...之前的代码
url = config.get_main_option("sqlalchemy.url")
if not database_exists(url):
create_database(url)
# ...之后的代码
$ alembic revision --autogenerate -m "create tables"
将自动生成如下的迁移脚本:
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'a5ddc2b0f7f8'
down_revision = None
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please