sqlachemy orm create or delete table

sqlacehmy  one to one    ------detial  to descript

 关于uselist的使用。如果你使用orm直接创建表关系,实际上在数据库中是可以创建成多对多的关系,如果加上uselist=False 你会发现你的orm只能查询出来一个,如果不要这个参数orm查询的就是多个,一对多的关系。数据库级别如果也要限制可以自行建立唯一键进行约束。

总结就是:sqlacehmy One to One 是orm级别限制

sqlacehmy 简单创建实例展示:

from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, DateTime ​ ​

Base = declarative_base()

engine = create_engine('mysql+pymysql://root:123456@localhost:3306/test?charset=utf8', echo=True) ​ ​ class Worker(Base):   # 表名   __tablename__ = 'worker'   id = Column(Integer, primary_key=True)   name = Column(String(50), unique=True)   age = Column(Integer)   birth = Column(DateTime)   part_name = Column(String(50)) ​ ​ # 创建数据表

Base.metadata.create_all(engine)

该方法引入declarative_base模块,生成其对象Base,再创建一个类Worker。一般情况下,数据表名和类名是一致的。tablename用于定义数据表的名称,可以忽略,忽略时默认定义类名为数据表名。然后创建字段id、name、age、birth、part_name,最后使用Base.metadata.create_all(engine)在数据库中创建对应的数据表

数据表的删除

删除数据表的时候,一定要先删除设有外键的数据表,也就是先删除part,然后才能删除worker,两者之间涉及外键,这是在数据库中删除数据表的规则。对于两种不同方式创建的数据表,删除语句也不一样。

Base.metadata.drop_all(engine)

part.drop(bind=engine)

part.drop(bind=engine) Base.metadata.drop_all(engine)

sqlachemy +orm + create table代码


from sqlalchemy import Column, String, create_engine, Integer, Text
from sqlalchemy.orm import sessionmaker,declarative_base
import time


# 创建对象的基类:
Base = declarative_base()


# 定义User对象:
class User(Base):
    # 表的名字:
    __tablename__ = 'wokers'

    # 表的结构:
    id = Column(Integer, autoincrement=True, primary_key=True, unique=True, nullable=False)
    name = Column(String(50), nullable=False)
    sex = Column(String(4), nullable=False)
    nation = Column(String(20), nullable=False)
    birth = Column(String(8), nullable=False)
    id_address = Column(Text, nullable=False)
    id_number = Column(String(18), nullable=False)
    creater = Column(String(32))
    create_time = Column(String(20), nullable=False)
    updater = Column(String(32))
    update_time = Column(String(20), nullable=False, default=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
                         onupdate=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
    comment = Column(String(200))


# 初始化数据库连接:
engine = create_engine('postgresql://postgres:name@pwd:port/dbname')  # 用户名:密码@localhost:端口/数据库名

Base.metadata.create_all(bind=engine)

可级联删除的写法实例 

class Parent(Base):
    __tablename__ = "parent"
    id = Column(Integer, primary_key=True)


class Child(Base):
    __tablename__ = "child"
    id = Column(Integer, primary_key=True)
    parentid = Column(Integer, ForeignKey(Parent.id, ondelete='cascade'))
    parent = relationship(Parent, backref="children")

sqlachemy 比较好用的orm介绍链接:https://www.cnblogs.com/DragonFire/p/10166527.html

sqlachemy的级联删除

https://www.cnblogs.com/ShanCe/p/15381412.html

除了以上例子还列举一下创建多对多关系实例

class UserModel(BaseModel):
    __tablename__ = "system_user"
    __table_args__ = ({'comment': '用户表'})

    username = Column(String(150), nullable=False, comment="用户名")
    password = Column(String(128), nullable=False, comment="密码")
    name = Column(String(40), nullable=False, comment="姓名")
    mobile = Column(String(20), nullable=True, comment="手机号")
    email = Column(String(255), nullable=True, comment="邮箱")
    gender = Column(Integer, default=1, nullable=False, comment="性别")
    avatar = Column(String(255), nullable=True, comment="头像")
    available = Column(Boolean, default=True, nullable=False, comment="是否可用")
    is_superuser = Column(Boolean, default=False, nullable=False, comment="是否超管")
    last_login = Column(DateTime, nullable=True, comment="最近登录时间")
    dept_id = Column(
        BIGINT,
        ForeignKey('system_dept.id', ondelete="CASCADE", onupdate="RESTRICT"),
        nullable=True, index=True, comment="DeptID"
    )

    dept_part = relationship('DeptModel',back_populates='user_part')
    roles = relationship("RoleModel", back_populates='users', secondary=UserRolesModel.__tablename__, lazy="joined")
    positions = relationship("PositionModel", back_populates='users_obj', secondary=UserPositionModel.__tablename__, lazy="joined")


class PositionModel(BaseModel):
    __tablename__ = "system_position_management"
    __table_args__ = ({'comment': '岗位表'})
    postion_number = Column(String(50), nullable=False, comment="岗位编号")
    postion_name = Column(String(50), nullable=False, comment="岗位名称")
    remark = Column(String(100), nullable=True, default="", comment="备注")
    positon_status = Column(Integer, nullable=False, default=0, comment="岗位状态")
    create_user = Column(Integer, nullable=True, comment="创建人")
    update_user = Column(Integer, nullable=True, comment="修改人")

    users_obj = relationship("UserModel", back_populates='positions', secondary=UserPositionModel.__tablename__, lazy="joined")

class UserPositionModel(BaseModel):
    __tablename__ = "system_user_position"
    __table_args__ = ({'comment': '用户岗位关联表'})

    user_id = Column(
        BIGINT,
        ForeignKey("system_user.id", ondelete="CASCADE", onupdate="RESTRICT"),
        primary_key=True, comment="用户ID"
    )
    position_id = Column(
        BIGINT,
        ForeignKey("system_position_management.id", ondelete="CASCADE", onupdate="RESTRICT"),
        primary_key=True, comment="岗位ID"
    )

以上实例是多对多关系,主要是由PositionModel进行量表之间的多对多关系的关联

多对多关系查询

Session=sessionmaker(bind=engine)
sessions=Session()
Userobj=sessions.query(UserModel).filter(UserModel.id == 1).first()
# Positionobj=sessions.query(PositionModel).filter(PositionModel.id == 14).first()
# Userobj.positions.append(Positionobj)
for item in Userobj.positions:
    print(item.postion_name)
sessions.commit()
sessions.close()

2个对象之间是通过relationship 关联参数进行 append 来创建关系

还可以通过remove来删除之间的关系

关于基类外键关系搭建

1.关系中的Mixin

在SQLAlchemy的declarative体系里面,Mixin惯用法也可以用在relationship中。relationship()函数创建的关系,可以用declared_attr方法,消除在复制关系及其绑定字段时可能产生的歧义。如下的示例,将外键和relationship组合在一起,这样Foo和Bar两个派生类,都可以被配置为通过多对一的关系关联到Target类(译注:目前正在做单独使用Superset后端的定制开发,会新增很多张表,似乎本节的方法可以用在模型定义上)。

class RefTargetMixin(object):
    @declared_attr
    def target_id(cls):
        return Column('target_id', ForeignKey('target.id'))

    @declared_attr
    def target(cls):
        return relationship("Target")

class Foo(RefTargetMixin, Base):
    __tablename__ = 'foo'
    id = Column(Integer, primary_key=True)

class Bar(RefTargetMixin, Base):
    __tablename__ = 'bar'
    id = Column(Integer, primary_key=True)

class Target(Base):
    __tablename__ = 'target'
    id = Column(Integer, primary_key=True)

 2.基类外键多表关系搭建(foreign_keys的使用)

class RefTargetMixin(object):

    @declared_attr
    def target_id(cls):
        return Column('target_id', ForeignKey('target.id'))

    @declared_attr
    def target(cls):
        return relationship("Target")

class Foo(RefTargetMixin, Base):
    __tablename__ = 'foo'
    id = Column(BIGINT, primary_key=True, autoincrement=True, unique=True, comment='主键ID', nullable=False)
    description = Column(Text, nullable=True, comment="备注")
    name = Column(String(40), nullable=False, comment="部门名称")
    order = Column(Integer, nullable=False, default=1, comment="显示排序")
    parent_id = Column(
        BIGINT,
        ForeignKey("foo.id", ondelete="CASCADE", onupdate="RESTRICT"),
        nullable=True, index=True, comment="父级部门ID"
    )
    available = Column(Boolean, nullable=False, default=True, comment="是否可用")
    # description = Column(Text, nullable=True, comment="备注")

    # user_part = relationship("UserModel", back_populates="dept_part")
    parent = relationship("Foo", foreign_keys=[parent_id], cascade='all, delete-orphan')


class Bar(RefTargetMixin, Base):
    __tablename__ = 'bar'
    id = Column(BIGINT, primary_key=True, autoincrement=True, unique=True, comment='主键ID', nullable=False)
    description = Column(Text, nullable=True, comment="备注")

    name = Column(String(50), nullable=False, comment="菜单名称")
    type = Column(Integer, nullable=False, comment="菜单类型")
    icon = Column(String(50), nullable=False, default="", comment="图标")
    order = Column(Integer, nullable=False, default=1, comment="显示排序")
    permission = Column(String(50), nullable=False, default="", comment="权限标识")
    route_name = Column(String(50), nullable=True, comment="路由名称")
    route_path = Column(String(50), nullable=True, comment="路由路径")
    component_path = Column(String(50), nullable=True, comment="组件路径")
    parent_id = Column(
        BIGINT,
        ForeignKey("bar.id", ondelete="CASCADE", onupdate="RESTRICT"),
        nullable=True, index=True, comment="父级菜单ID"
    )
    parent_name = Column(String(50), nullable=True, comment="父级菜单名称")
    available = Column(Boolean, nullable=False, default=True, comment="是否可用")
    cache = Column(Boolean, nullable=False, default=True, comment="是否缓存")
    hidden = Column(Boolean, nullable=False, default=False, comment="是否隐藏")
    # description = Column(Text, nullable=True, comment="备注")

    parent = relationship("Bar", cascade='all, delete-orphan')
    # roles = relationship("RoleModel", back_populates='menus', secondary=RoleMenusModel.__tablename__, lazy="joined")

class Target(Base):
    __tablename__ = 'target'
    id = Column(BIGINT, primary_key=True, autoincrement=True, unique=True, comment='主键ID', nullable=False)
    description = Column(Text, nullable=True, comment="备注")

    username = Column(String(150), nullable=False, comment="用户名")
    password = Column(String(128), nullable=False, comment="密码")
    name = Column(String(40), nullable=False, comment="姓名")
    mobile = Column(String(20), nullable=True, comment="手机号")
    email = Column(String(255), nullable=True, comment="邮箱")
    gender = Column(Integer, default=1, nullable=False, comment="性别")
    avatar = Column(String(255), nullable=True, comment="头像")
    available = Column(Boolean, default=True, nullable=False, comment="是否可用")
    is_superuser = Column(Boolean, default=False, nullable=False, comment="是否超管")
    last_login = Column(DateTime, nullable=True, comment="最近登录时间")
    dept_id = Column(
        BIGINT,
        ForeignKey('system_dept.id', ondelete="SET NULL", onupdate="RESTRICT"),
        nullable=True, index=True, comment="部门ID"
    )

    dept = relationship('Foo')
    # roles = relationship("RoleModel", secondary=UserRolesModel.__tablename__, lazy="joined")
    # positions = relationship("PositionModel", secondary=UserPositionsModel.__tablename__, lazy="joined")

说明

关于sqlachemy 主键继承问题 

class CustomMixin(TimestampMixin):
    """
    自定义公共 ORM 模型
    """

    id = Column(BIGINT, primary_key=True, autoincrement=True, unique=True, comment='主键ID', nullable=False)
    description = Column(Text, nullable=True, comment="备注")

    @declared_attr
    def creator_id(cls):
        return Column(
            BIGINT,
            ForeignKey("system_user.id", ondelete="SET NULL", onupdate="RESTRICT"),
            nullable=True, index=True, comment="创建人"
        )

    @declared_attr
    def creator(cls):
        return relationship("UserModel", foreign_keys=cls.creator_id)
class UserModel(CustomMixin, Model):
    __tablename__ = "system_user"
    __table_args__ = ({'comment': '用户表'})

    username = Column(String(150), nullable=False, comment="用户名")
    password = Column(String(128), nullable=False, comment="密码")
    name = Column(String(40), nullable=False, comment="姓名")
    mobile = Column(String(20), nullable=True, comment="手机号")
    email = Column(String(255), nullable=True, comment="邮箱")
    gender = Column(Integer, default=1, nullable=False, comment="性别")
    avatar = Column(String(255), nullable=True, comment="头像")
    available = Column(Boolean, default=True, nullable=False, comment="是否可用")
    is_superuser = Column(Boolean, default=False, nullable=False, comment="是否超管")
    last_login = Column(DateTime, nullable=True, comment="最近登录时间")
    dept_id = Column(
        BIGINT,
        ForeignKey('system_dept.id', ondelete="SET NULL", onupdate="RESTRICT"),
        nullable=True, index=True, comment="部门ID"
    )

    dept = relationship('DeptModel', primaryjoin="UserModel.dept_id == DeptModel.id")
    roles = relationship("RoleModel", secondary=UserRolesModel.__tablename__, lazy="joined")
    positions = relationship("PositionModel", secondary=UserPositionsModel.__tablename__, lazy="joined")

关于sqlachemy 模型外键 relationship   配置scheme问题解决

 仅仅主要配置relationship relationship 关联值

class PositionOut(Basemodel):

        id : int

        name: str

positions = PositionOut

即可!

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kotlin提供了多个ORM框架其中两个比较常用的是Room和Exposed。 1. Room是Google官方推出的数据库ORM框架,它将关系型数据库映射为面向对象的语言。使用Room,我们可以使用面向对象的思想操作关系型数据库,而无需编写SQL语句[^1]。以下是使用Room的示例代码: ```kotlin // 定义实体类 @Entity data class User( @PrimaryKey val id: Int, val name: String, val age: Int ) // 定义数据库访问对象(DAO) @Dao interface UserDao { @Query("SELECT * FROM user") fun getAllUsers(): List<User> @Insert fun insertUser(user: User) @Update fun updateUser(user: User) @Delete fun deleteUser(user: User) } // 创建数据库 @Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao } // 在应用中使用数据库 val db = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "database-name" ).build() val userDao = db.userDao() val users = userDao.getAllUsers() ``` 2. Exposed是Kotlin的另一个ORM框架,它提供了类型安全的SQL和轻量级数据访问对象。Exposed的特点是简单易用,且具有良好的类型安全性[^2]。以下是使用Exposed的示例代码: ```kotlin // 定义实体类 object Users : Table() { val id = integer("id").autoIncrement().primaryKey() val name = varchar("name", length = 50) val age = integer("age") } // 创建数据库连接 Database.connect("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;", driver = "org.h2.Driver") // 定义数据库表 transaction { SchemaUtils.create(Users) } // 插入数据 transaction { Users.insert { it[name] = "John" it[age] = 25 } } // 查询数据 transaction { val users = Users.selectAll().map { User(it[Users.id], it[Users.name], it[Users.age]) } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值