`
ryan.liu
  • 浏览: 134185 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

sqlalchemy

阅读更多

 

通常我们在数据库中设计好了多张表,在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))
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics