通常我们在数据库中设计好了多张表,在SQLAlchemy中有个autoload可以自动加载.
让我们的Model都继承自某个虚类,这个虚类在需要时会自动加载一次表结构
生成我们需要的基类,并绑定数据库连接
定义我们的Model,设置表名和外键关联
可以使用session执行SQL了,scoped_session让maker生成的多个session实际上是重用同一个,
autocommit=True容易导致Bugs,我们使用默认设置不开启它。
在使用过程中发现几个小时后,数据库连接会断掉而没有重新连接,后来在连接时加入pool_recycle=3600,不知是否有用。
保险起见,可以在models中只生成Session类,要用时再创建实例。
# -*- coding: utf-8 -*- from sqlalchemy import create_engine, Table from sqlalchemy.orm import sessionmaker, scoped_session, relationship, backref from sqlalchemy.ext.declarative import declarative_base, declared_attr from configs.settings import MYSQL_DATABASES, MYSQL_TABLE_PREFIX class Base(object): __abstract__ = True __table_args__ = {"mysql_engine": "InnoDB"} @declared_attr def __table__(cls): name = cls.__tablename__ return Table(name, cls.metadata, autoload=True) engine = create_engine( MYSQL_DATABASES["default"] + "?charset=utf8", encoding="utf-8", pool_size=5, pool_recycle=3600) Base = declarative_base(cls=Base, bind=engine) class Guide(Base): __tablename__ = MYSQL_TABLE_PREFIX + "guide" category = relationship("Category", primaryjoin="Guide.category_id==Category.id", foreign_keys="Guide.category_id", backref="guides") contents = relationship("Content", primaryjoin="Guide.id==Content.guide_id", foreign_keys="Content.guide_id", order_by="Content.section", backref="guide") class Category(Base): __tablename__ = MYSQL_TABLE_PREFIX + "category" class Content(Base): __tablename__ = MYSQL_TABLE_PREFIX + "content" Session = scoped_session(sessionmaker(autoflush=True))