您的位置:首页 > 数据库

一次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)
)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: