zoukankan      html  css  js  c++  java
  • SQLALchemy 快速使用

    SQLALchemy

    Smile

    详细的使用文档:https://www.osgeo.cn/sqlalchemy/orm/session_basics.html#update-and-delete-with-arbitrary-where-clause

    1. sqlalchemy安装

    pip install sqlalchemy

    mysqldb是Python支持的MySQL数据库驱动

    · pip install mysqlclient(Windows)
    · pip install mysql-python(mix os)
    · apt-get install python-mysqldb(Linux Ubuntu)

    提示:ModuleNotFoundError: No module named 'MySQLdb' 安装以上

    1. 数据库配置信息

    '数据库类型+数据库驱动名称://用户名:密码@服务器地址:端口号/数据库名'

    如:

    mysql+mysqldb: //root:@localhost:3306/Students?charset=utf8

    1. 核心类介绍

    from sqlalchemy import Column, ForeignKey, Integer, String  # ORM中对象映射中与数据库中对应的数据类型
    from sqlalchemy.ext.declarative import declarative_base     # 所有定义的类 需要基础的基类
    from sqlalchemy.orm import relationship   # 表与表之间的关系定义
    from sqlalchemy import create_engine   # 创建数据库之间的链接
    from sqlalchemy.orm import sessionmaker  # 操作数据库之间的会话

    对于数据类型可以在 # sqlalchemy/__init__.py 去查看

    from .types import BLOB
    from .types import Boolean
    from .types import CHAR
    from .types import CLOB
    from .types import Date
    from .types import DateTime
    from .types import DECIMAL
    from .types import Float
    from .types import INTEGER
    from .types import JSON
    from .types import LargeBinary
    from .types import NCHAR
    from .types import Numeric
    from .types import NVARCHAR
    from .types import REAL
    from .types import SMALLINT
    from .types import SmallInteger
    from .types import String
    from .types import TEXT

    远远不止这些,并且 提供了多种命名方式

    1. 基本建表流程

    # coding = utf-8
    
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String
    
    mysql_sql = "mysql+mysqldb://root:root@localhost:3306/blog?charset=utf8"
    
    # 这里建立一个Person table
    
    engine = create_engine(mysql_sql)
    Base = declarative_base()
    
    
    class Person(Base):
        __tablename__ = 'Person'
        id = Column(Integer, primary_key=True)
        name = Column(String(25), nullable=False)
    
    
    # 创建库
    Base.metadata.create_all(engine)

    一对多关系

    1. 一对多关系

    class User(Base):
        __tablename__ = "User"
        id = Column(Integer, primary_key=True)
        username = Column(String(64), nullable=False, index=True)
        password = Column(String(64), nullable=False)
        email = Column(String(64), nullable=False, index=True)
        articles = relationship("Article")
    
        def __repr__(self):
            return '%s' % self.__class__.__name__
    
    
    class Article(Base):
        __tablename__ = 'Article'
        id = Column(Integer, primary_key=True)
        title = Column(String(255), nullable=False, index=True)
        content = Column(Text)
        user_id = Column(Integer, ForeignKey('User.id'))
        user = relationship('User')
    
        def __repr__(self):
            return '%s' % self.__class__.__name__
    • nullable 是否允许字段为null ,False
    • index :是否建立索引
    • relationship 只是维护关系,表中并无体现实际字段 ,内容相互关联的表
    • ForeignKey: 为定义外键,内容为相互关联的外键字段,注意与__tablename__中内容相符合

    一对一关系

    1. 一对一关系

    一个用户User有唯一的扩展信息。我们可以把它们放到另一张 UserInfo 表中,关系是一对一

    backref: 可以单边维护关系,两边不需要同时写relationship

    class UserInfo(Base):
    
        __tablename__ = 'userinfo'
    
        id = Column(Integer, primary_key=True)
        name = Column(String(64))
        qq = Column(String(11))
        phone = Column(String(11))
        link = Column(String(64))
        user_id = Column(Integer, ForeignKey('User.id'))
        
    class User(Base):
        __tablename__ = "User"
        id = Column(Integer, primary_key=True)
        username = Column(String(64), nullable=False, index=True)
        password = Column(String(64), nullable=False)
        email = Column(String(64), nullable=False, index=True)
        articles = relationship("Article")
        articles = relationship("UserInfo",backref=False,uselist=False)
    
        def __repr__(self):
            return '%s' % self.__class__.__name__

    多对多关系

    1. 多对多关系

    标签与博客之间就是一个多对多的关系,需要引入第三张表来存放,两则之间的关系。

    # 为中间表
    article_tag = Table(
        'article_tag', Base.metadata,
        Column('article_id', Integer, ForeignKey('Article.id')),
        Column('tag_id', Integer, ForeignKey('Tag.id'))
    )
    
    class Tag(Base):
        __tablename__ = 'Tag'
    
        id = Column(Integer, primary_key=True)
        name = Column(String(64), nullable=False, index=True)
    
        def __repr__(self):
            return '%s(%r)' % (self.__class__.__name__, self.name)
    1. 基本操作s

    2. # coding = utf-8
      
      # coding = utf-8
      from sqlalchemy import create_engine, ForeignKey, Table
      from sqlalchemy.ext.declarative import declarative_base
      from sqlalchemy import Column, Integer, String, Text, Float, Date, DateTime
      from sqlalchemy.orm import relationship
      from sqlalchemy.orm import sessionmaker
      
      mysql_sql = "mysql+mysqldb://root:root@localhost:3306/test?charset=utf8"
      
      engine = create_engine(mysql_sql)
      Base = declarative_base()
      
      
      class Car(Base):
          __tablename__ = "Cars"
      
          Id = Column(Integer, primary_key=True)
          Name = Column(String(25))
          Price = Column(Integer)
      
          def __repr__(self):
              return  "%s %s %s %s"% (self.__class__.__name__,self.Id,self.Name,self.Price)
      
      
      Base.metadata.bind = engine
      Base.metadata.create_all(engine)
      
      Session = sessionmaker(bind=engine)
      session = Session()
      
      # 插入数据
      # session.add_all(
      #     [Car(Id=1, Name='Audi', Price=52642),
      #      Car(Id=2, Name='Mercedes', Price=57127),
      #      Car(Id=3, Name='Skoda', Price=9000),
      #      Car(Id=4, Name='Volvo', Price=29000),
      #      Car(Id=5, Name='Bentley', Price=350000),
      #      Car(Id=6, Name='Citroen', Price=21000),
      #      Car(Id=7, Name='Hummer', Price=41400),
      #      Car(Id=8, Name='Volkswagen', Price=21600)])
      # session.commit()
      
      # 查询所有
      rs = session.query(Car).all()
      for x in rs:
          print(x)
      # 查询第一次数据数据
      rs1 = session.query(Car).get(1)
      print(rs1)
      
      # 增加一个数据
      c1 = Car(Name="dongfeng",Price="255000")
      session.add(c1)
      session.commit()
      
      # 过滤数据 条件查询 谓词
      
      c2 = session.query(Car).filter(Car.Name.like("V%"))
      print(c2) # 查看Sql
      print(c2.all())
      
      # 删除
      c3 = session.query(Car).filter(Car.Id.in_([1]))
      print("c3:%s",c3)
      session.delete(c3)
  • 相关阅读:
    Docker用途 & 和tomcat的区别
    Ubuntu安装Redis
    Ubuntu查看和设置Root账户
    Oracle常用语句
    Redis知识总结
    Blazor学习笔记01: 使用BootstrapBlazor组件 创建一个具有单表维护功能的表格页面
    NET Core之积沙成塔01: 解决Visual Studio 2019 代码提示为英文
    MySQL系统自带的数据库information schema
    Windows安装mysql方法
    数据库之概念
  • 原文地址:https://www.cnblogs.com/dgwblog/p/14847415.html
Copyright © 2011-2022 走看看