一次Sqlalchemy从model类定义到数据库表的SQL脚本自动生成日志
2011-11-22 15:31
363 查看
一次Sqlalchemy从model类定义到数据库表的SQL脚本自动生成日志
CREATE TABLE session ( session_id VARCHAR(128) NOT NULL, atime TIMESTAMP NULL, data TEXT, PRIMARY KEY (session_id) )
一个Python模型类的定义如下:
class Group(Base): __tablename__ = 'group' id = Column(Integer, primary_key=True) name = Column(String(64), nullable=False) users = relationship("User", secondary=group_user_asso_table, backref=backref('groups'))
模型类Group生成的SQL如下:
CREATE TABLE `group` ( id INTEGER NOT NULL AUTO_INCREMENT, name VARCHAR(64) NOT NULL, PRIMARY KEY (id) )
-----------------------------------------------------------------------------------------------
class User(Base): __tablename__ = 'user' id = Column(Integer, primary_key=True) username = Column(String(32), nullable=False) password = Column(String(64), nullable=False) email = Column(String(64), nullable=False) is_active = Column(Boolean, nullable=False, default=False) is_superuser = Column(Boolean, nullable=False, default=False) last_login = Column(TIMESTAMP, default=utcnow()) joined_time = Column(TIMESTAMP, default=utcnow())
模型类User生成的SQL如下:
CREATE TABLE user ( id INTEGER NOT NULL AUTO_INCREMENT, -- id = Column(Integer, primary_key=True) username VARCHAR(32) NOT NULL, -- username = Column(String(32), nullable=False) password VARCHAR(64) NOT NULL, -- password = Column(String(64), nullable=False) email VARCHAR(64) NOT NULL, -- email = Column(String(64), nullable=False) is_active BOOL NOT NULL, -- is_active = Column(Boolean, nullable=False, default=False) is_superuser BOOL NOT NULL, -- is_superuser = Column(Boolean, nullable=False, default=False) last_login TIMESTAMP NULL, -- last_login = Column(TIMESTAMP, default=utcnow()) joined_time TIMESTAMP NULL, -- last_login = Column(TIMESTAMP, default=utcnow()) PRIMARY KEY (id), CHECK (is_active IN (0, 1)), CHECK (is_superuser IN (0, 1)) )
-----------------------------------------------------------------------------------------------
class Permission(Base): __tablename__ = 'permission' id = Column(Integer, primary_key=True) name = Column(String(64), nullable=False) codename = Column(String(64), nullable=False) order = Column(SmallInteger) #关联自身表的设置 parent_id = Column(Integer, ForeignKey('permission.id')) #relationship的使用,backref参数 children = relationship("Permission", backref=backref('parent'), remote_side=[id]) ##想标明的是permission与group表拥有的是多对多关联,他们之间的使用中间表permission_group_asso_table的定义 groups = relationship("Group", secondary=permission_group_asso_table, backref=backref('permissions')) ##users = relationship("User", secondary=permission_user_asso_table, backref=backref('permissions'))
relationship函数的参数说明:
relationship("Group", secondary=permission_group_asso_table, backref=backref('permissions'))
或
relationship("Permission", backref=backref('parent'), remote_side=[id])
permission、group 表之间的关联关系呢?如何配置,看:
permission_group_asso_table = Table('permission_group_asso', Base.metadata, Column('permission_id', Integer, ForeignKey('permission.id'), primary_key=True), Column('group_id', Integer, ForeignKey('group.id'), primary_key=True) )
这段代码所起到的作用是创建一个中间表permission_group_asso,外键关联到表permission、group,而且使用两个表的主键作为联合主键的方式,SQL如下:
CREATE TABLE permission_group_asso ( permission_id INTEGER NOT NULL, -- Column('permission_id', Integer, ForeignKey('permission.id'), primary_key=True), group_id INTEGER NOT NULL, -- Column('group_id', Integer, ForeignKey('group.id'), primary_key=True) PRIMARY KEY (permission_id, group_id), -- 使用两个表的主键 FOREIGN KEY(permission_id) REFERENCES permission (id), FOREIGN KEY(group_id) REFERENCES `group` (id) )
#"Permission"对应到参数argument
:param argument:
对应关联关系的目标模型类
:param secondary:
这个参数主要是为应对many-to-many关联的,指定中间表。这个中间表需要使用Table方式定义,如permission_group_asso_table的代码。
通常来说也是互斥,只能使用在一个模型类中。
:param backref:
indicates the string name of a property to be placed on the related
mapper's class that will handle this relationship in the other
direction. The other property will be created automatically
when the mappers are configured. Can also be passed as a
:func:`backref` object to control the configuration of the
new relationship.
:param remote_side:
使用在自我参照的关系中,如树形结构的,表与自身的关联
从生成的SQL脚本,一一对应起来,可以看到以下的效果
CREATE TABLE permission ( id INTEGER NOT NULL AUTO_INCREMENT, -- id = Column(Integer, primary_key=True) name VARCHAR(64) NOT NULL, -- name = Column(String(64), nullable=False) codename VARCHAR(64) NOT NULL, -- codename = Column(String(64), nullable=False) `order` SMALLINT, -- order = Column(SmallInteger) parent_id INTEGER, -- 外键关联的设置方式 parent_id = Column(Integer, ForeignKey('permission.id')) PRIMARY KEY (id), FOREIGN KEY(parent_id) REFERENCES permission (id) )-----------------------------------------------------------------------------------------------
CREATE TABLE permission_user_asso ( permission_id INTEGER NOT NULL, user_id INTEGER NOT NULL, PRIMARY KEY (permission_id, user_id), FOREIGN KEY(permission_id) REFERENCES permission (id), FOREIGN KEY(user_id) REFERENCES user (id) ) CREATE TABLE group_user_asso ( group_id INTEGER NOT NULL, user_id INTEGER NOT NULL, PRIMARY KEY (group_id, user_id), FOREIGN KEY(group_id) REFERENCES `group` (id), FOREIGN KEY(user_id) REFERENCES user (id) )
相关文章推荐
- 利用Excel的vba脚本根据数据库表结构自动生成java的action,bean,dao,mode,service,xml,sql,jsp等
- atitit.自动生成数据库结构脚本,或者更换数据库,基于hibernate4
- 自动生成Insert数据的SQL脚本
- SQL Server 生成sql脚本并执行 还原数据库
- 最实际与高效生成数据库高级声明式SQL脚本神器研发
- 自动创建数据库并按顺序导入sql文件的shell脚本
- atitit.自动生成数据库结构脚本,或者更换数据库,基于hibernate4
- sql2005(含“说明”字段)数据库设计文档自动生成方法
- power designer pdm生成sql脚本和数据库
- 从已有数据库生成脚本来获得生成数据表、视图、函数、存储过程以及触发器的SQL语句
- SQL清除所有数据库日志脚本
- power designer pdm生成sql脚本和数据库以及逆向工程
- 用Log4j自动生成日志(多种方式)输出到文件、数据库等
- SQL清除所有数据库日志脚本
- FineUI之使用SQL脚本从数据库表中生成对应的输入控件
- 根据库中的表自动生成数据字典的T-SQL脚本
- pdm生成sql脚本和数据库
- 自动生成清空数据库的SQL语句 ----C#.NET 通用权限管理系统,.NET 开发者的福音
- MS SQL SERVER 清理数据库日志脚本
- 自动生成Insert数据的SQL脚本