mysql表创建在Python3中的使用(sqlalchemy)

起步

#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""sqlalchemy创建表

四张表:业务线,服务,用户,角色,利用ORM创建出它们,并建立好它们直接的关系
"""

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.sql import func
from sqlalchemy import Column
from sqlalchemy import Boolean
from sqlalchemy import Integer
from sqlalchemy import BigInteger
from sqlalchemy import SmallInteger
from sqlalchemy import Float
from sqlalchemy import DECIMAL
from sqlalchemy import CHAR
from sqlalchemy import VARCHAR
from sqlalchemy import String
from sqlalchemy import Text
from sqlalchemy import Time
from sqlalchemy import Date
from sqlalchemy import DateTime
from sqlalchemy import TIMESTAMP
from sqlalchemy import Enum
from sqlalchemy import JSON
from sqlalchemy import CheckConstraint
from sqlalchemy import ForeignKey
from sqlalchemy import ForeignKeyConstraint
from sqlalchemy import PrimaryKeyConstraint
from sqlalchemy import UniqueConstraint
from sqlalchemy import Index

Base = declarative_base()
# sqlalchemy会把继承Base的所有类转化成sql并生成表

engine = create_engine('mysql+pymysql://root:123@localhost/hardy4_db?charset=utf8mb4', max_overflow=10, echo=True)

创建单表

# 创建单表:业务线
class Business(Base):
    __tablename__ = 'business'
    id = Column(Integer, nullable=False, primary_key=True, autoincrement=True)
    ident = Column(Integer, nullable=False, unique=True)
    bname = Column(String(length=32), nullable=False, index=True)  # String ---> varchar  index: ix_business2_bname2
    bname2 = Column(CHAR(length=32), nullable=False, index=True)  # char ---> char
    price = Column(Float(precision=10))
    money = Column(DECIMAL(precision=10, scale=4))
    language = Column(Enum('python3', 'django2.2.1', 'flask'))
    create_date = Column(Date)
    create_time = Column(Time)
    create_datetime = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
    create_timestamp = Column(TIMESTAMP(timezone=True), server_default=func.now(), onupdate=func.now())
    content_text = Column(Text)
    status = Column(Boolean)  # 通过check约束实现
    jdoc = Column(JSON)

一对多 or 多对一

# 多对一: 多个服务可以属于一个业务线,多个业务线不能包含同一个服务
class Service(Base):
    __tablename__ = 'service'
    id = Column(Integer, nullable=False, primary_key=True, autoincrement=True)
    sname = Column(String(32), nullable=False, index=True)
    sname2 = Column(VARCHAR(32), nullable=False, index=True)
    ip = Column(String(15), nullable=False)
    port = Column(Integer, nullable=False)

    business_id = Column(Integer, ForeignKey(column='business.id', onupdate='CASCADE', ondelete='CASCADE'))

    __table_args__ = (
        UniqueConstraint(ip, port, name='uix_ip_port'),
        Index('ix_id_sname', id, sname),
        CheckConstraint(sqltext='port > 8080', name='service_chk_1')
    )

一对一

# 一对一:一种角色只能管理一条业务线,一条业务线也只能被一种角色管理
class Role(Base):
    __tablename__ = 'role'
    id = Column(Integer, primary_key=True, autoincrement=True)
    rname = Column(String(32), nullable=False, index=True)
    priv = Column(String(64), nullable=False)

    business_id = Column(Integer, ForeignKey(column='business.id', name='fk_role_to_bid'), unique=True)

多对多

# 多对多:多个用户可以是同一个role,多个role可以包含同一个用户
class Users(Base):
    __tablename__ = 'users'
    id = Column(Integer, autoincrement=True)
    uname = Column(String(32), nullable=False, index=True)

    __table_args__ = (
        PrimaryKeyConstraint(id, uname, name='pk_id_uname'),
    )


class Users2Role(Base):
    __tablename__ = 'users2role'
    id = Column(Integer, primary_key=True, autoincrement=True)
    uid = Column(Integer, ForeignKey(column='users.id'))
    rid = Column(Integer, ForeignKey(column='role.id'))

    __table_args = (
        UniqueConstraint(uid, rid, name='uix_uid_rid'),
    )

联合外键

# 联合外键
class Host100(Base):
    __tablename__ = 'host100'
    id = Column(Integer, autoincrement=True, unique=True)
    ip = Column(String(32))
    port = Column(Integer)

    __table_args__ = (
        PrimaryKeyConstraint(ip, port),
    )


class Host200(Base):
    __tablename__ = 'host200'
    id = Column(Integer, primary_key=True, autoincrement=True)
    ip = Column(String(32))
    port = Column(Integer)

    __table_args__ = (
        ForeignKeyConstraint(columns=(ip, port), refcolumns=('host100.ip', 'host100.port')),
    )

初始化表

Base.metadata.create_all(bind=engine)

删除表

Base.metadata.drop_all(bind=engine)

整体代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""sqlalchemy创建表

四张表:业务线,服务,用户,角色,利用ORM创建出它们,并建立好它们直接的关系
"""

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.sql import func
from sqlalchemy import Column
from sqlalchemy import Boolean
from sqlalchemy import Integer
from sqlalchemy import BigInteger
from sqlalchemy import SmallInteger
from sqlalchemy import Float
from sqlalchemy import DECIMAL
from sqlalchemy import CHAR
from sqlalchemy import VARCHAR
from sqlalchemy import String
from sqlalchemy import Text
from sqlalchemy import Time
from sqlalchemy import Date
from sqlalchemy import DateTime
from sqlalchemy import TIMESTAMP
from sqlalchemy import Enum
from sqlalchemy import JSON
from sqlalchemy import CheckConstraint
from sqlalchemy import ForeignKey
from sqlalchemy import ForeignKeyConstraint
from sqlalchemy import PrimaryKeyConstraint
from sqlalchemy import UniqueConstraint
from sqlalchemy import Index


Base = declarative_base()
# sqlalchemy会把继承Base的所有类转化成sql并生成表

engine = create_engine('mysql+pymysql://root:123@localhost/hardy4_db?charset=utf8mb4', max_overflow=10, echo=True)


# 创建单表:业务线
class Business(Base):
    __tablename__ = 'business'
    id = Column(Integer, nullable=False, primary_key=True, autoincrement=True)
    ident = Column(Integer, nullable=False, unique=True)
    bname = Column(String(length=32), nullable=False, index=True)  # String ---> varchar  index: ix_business2_bname2
    bname2 = Column(CHAR(length=32), nullable=False, index=True)  # char ---> char
    price = Column(Float(precision=10))
    money = Column(DECIMAL(precision=10, scale=4))
    language = Column(Enum('python3', 'django2.2.1', 'flask'))
    create_date = Column(Date)
    create_time = Column(Time)
    create_datetime = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
    create_timestamp = Column(TIMESTAMP(timezone=True), server_default=func.now(), onupdate=func.now())
    content_text = Column(Text)
    status = Column(Boolean)  # 通过check约束实现
    jdoc = Column(JSON)


# 多对一: 多个服务可以属于一个业务线,多个业务线不能包含同一个服务
class Service(Base):
    __tablename__ = 'service'
    id = Column(Integer, nullable=False, primary_key=True, autoincrement=True)
    sname = Column(String(32), nullable=False, index=True)
    sname2 = Column(VARCHAR(32), nullable=False, index=True)
    ip = Column(String(15), nullable=False)
    port = Column(Integer, nullable=False)

    business_id = Column(Integer, ForeignKey(column='business.id', onupdate='CASCADE', ondelete='CASCADE'))

    __table_args__ = (
        UniqueConstraint(ip, port, name='uix_ip_port'),
        Index('ix_id_sname', id, sname),
        CheckConstraint(sqltext='port > 8080', name='service_chk_1')
    )


# 一对一:一种角色只能管理一条业务线,一条业务线也只能被一种角色管理
class Role(Base):
    __tablename__ = 'role'
    id = Column(Integer, primary_key=True, autoincrement=True)
    rname = Column(String(32), nullable=False, index=True)
    priv = Column(String(64), nullable=False)

    business_id = Column(Integer, ForeignKey(column='business.id', name='fk_role_to_bid'), unique=True)


# 多对多:多个用户可以是同一个role,多个role可以包含同一个用户
class Users(Base):
    __tablename__ = 'users'
    id = Column(Integer, autoincrement=True)
    uname = Column(String(32), nullable=False, index=True)

    __table_args__ = (
        PrimaryKeyConstraint(id, uname, name='pk_id_uname'),
    )


class Users2Role(Base):
    __tablename__ = 'users2role'
    id = Column(Integer, primary_key=True, autoincrement=True)
    uid = Column(Integer, ForeignKey(column='users.id'))
    rid = Column(Integer, ForeignKey(column='role.id'))

    __table_args = (
        UniqueConstraint(uid, rid, name='uix_uid_rid'),
    )


# 联合外键
class Host100(Base):
    __tablename__ = 'host100'
    id = Column(Integer, autoincrement=True, unique=True)
    ip = Column(String(32))
    port = Column(Integer)

    __table_args__ = (
        PrimaryKeyConstraint(ip, port),
    )


class Host200(Base):
    __tablename__ = 'host200'
    id = Column(Integer, primary_key=True, autoincrement=True)
    ip = Column(String(32))
    port = Column(Integer)

    __table_args__ = (
        ForeignKeyConstraint(columns=(ip, port), refcolumns=('host100.ip', 'host100.port')),
    )


def init_db():
    Base.metadata.create_all(bind=engine)


def drop_db():
    Base.metadata.drop_all(bind=engine)


if __name__ == '__main__':
    init_db()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值