zoukankan      html  css  js  c++  java
  • SQLAchemy

    SQLAchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据库PAI执行SQL并获取执行结果。

    SQLAchemy本身无法操作数据库,必须以第三方插件,Dialect用于和数据库PAI进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作。

    MySQL-Python
    
        mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
    
      
    
    pymysql
    
        mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
    
      
    
    MySQL-Connector
    
        mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
    
      
    
    cx_Oracle
    
        oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
    
      
    
    更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html
    说明

    一、底层处理
    使用Engine/ConnectionPoolling/Dialect进行数据库操作,Engine使用ConnectionPooling连接数据库,然后再通过Dialect执行SQL语句。

    from sqlalchemy import create_engine
    
    engine = create_engine("mysql+pymysql://test:123456@192.168.254.129/test", max_overflow=5)
    # 执行sql语句
    # cur = engine.execute(
    #     "insert into sanguo (name,age) values ('zhangzhao',38)"
    # )
    # # 新插入行自增id
    # new_id = cur.lastrowid
    # print(new_id)
    # cur = engine.execute("select * from sanguo where id > 5")
    # 获取一行数据
    # ret = cur.fetchone()
    # 获取第n行数据
    # cur.fetchmany(3)
    # 获取所有数据
    # cur.fetchall()
    # cur = engine.execute("insert into sanguo (name,age) VALUES (%s,%s)",[('lvbu',21),('yuanshao',27)])
    # print(ret)
    示例

    二、ORM功能使用:
    使用ORM/Schema TYpe/SQL Expression Language/Engine/ConnectionPooling/Dialect所有组件对数据进行操作。根据类创建对象,对象转换成SQL,执行SQL。

    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    from sqlalchemy import create_engine
    
    engine = create_engine("mysql+pymysql://test:123456@192.168.254.129:3306/test", max_overflow=5)
    Base = declarative_base()
    
    
    class Group(Base):
        __tablename__ = 'groups'
        nid = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(32))
    
    
    class User(Base):
        __tablename__ = 'user'
        nid = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(32))
        group_id = Column(Integer, ForeignKey('groups.nid'))
    
        def __repr__(self):
            """
            自定制
            """
            temp = '%s-%s' %(self.nid, self.name)
            return temp
    
    # 创建数据库函数
    def init_db():
        Base.metadata.create_all(engine)
    
    # 删除数据库函数
    def drop_db():
        Base.metadata.drop_all(engine)
    
    init_db()
    创建数据库
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    from sqlalchemy import create_engine
    
    engine = create_engine("mysql+pymysql://test:123456@192.168.254.129:3306/test", max_overflow=5)
    Base = declarative_base()
    
    
    class Group(Base):
        __tablename__ = 'groups'
        nid = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(32))
    
    
    class User(Base):
        __tablename__ = 'user'
        nid = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(32))
        group_id = Column(Integer, ForeignKey('groups.nid'))
    
        def __repr__(self):
            """
            自定制
            """
            temp = '%s-%s' %(self.nid, self.name)
            return temp
    
    # 创建数据库函数
    def init_db():
        Base.metadata.create_all(engine)
    
    # 删除数据库函数
    def drop_db():
        Base.metadata.drop_all(engine)
    
    # init_db()
    session = sessionmaker(bind=engine)
    sess = session()
    # 向组里添加数据
    sess.add(Group(name='dba'))
    sess.add(Group(name='sa'))
    # 批量添加
    sess.add_all([User(name='cable', group_id=2),
                 User(name='caocao', group_id=1)])
    sess.commit()
    添加数据
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    from sqlalchemy import create_engine
    
    engine = create_engine("mysql+pymysql://test:123456@192.168.254.129:3306/test", max_overflow=5)
    Base = declarative_base()
    
    
    class Group(Base):
        __tablename__ = 'groups'
        nid = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(32))
    
    
    class User(Base):
        __tablename__ = 'user'
        nid = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(32))
        group_id = Column(Integer, ForeignKey('groups.nid'))
    
        def __repr__(self):
            """
            自定制
            """
            temp = '%s-%s' %(self.nid, self.name)
            return temp
    
    # 创建数据库函数
    def init_db():
        Base.metadata.create_all(engine)
    
    # 删除数据库函数
    def drop_db():
        Base.metadata.drop_all(engine)
    
    # init_db()
    session = sessionmaker(bind=engine)
    sess = session()
    ret = sess.query(User).filter(User.name=='cable').all()
    obj = ret[0]    # 默认获取的为对象
    print(ret)
    print(obj.name)
    res = sess.query(User).all()    # 获取所有
    print(res)
    ret = sess.query(User.name).all()   # 指定获取的字段,即可得到列表
    print(ret)
    获取数据
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    from sqlalchemy import create_engine
    
    engine = create_engine("mysql+pymysql://test:123456@192.168.254.129:3306/test", max_overflow=5)
    Base = declarative_base()
    
    
    class Group(Base):
        __tablename__ = 'groups'
        nid = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(32))
    
    
    class User(Base):
        __tablename__ = 'user'
        nid = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(32))
        group_id = Column(Integer, ForeignKey('groups.nid'))
    
        def __repr__(self):
            """
            自定制
            """
            temp = '%s-%s' %(self.nid, self.name)
            return temp
    
    # 创建数据库函数
    def init_db():
        Base.metadata.create_all(engine)
    
    # 删除数据库函数
    def drop_db():
        Base.metadata.drop_all(engine)
    
    # init_db()
    session = sessionmaker(bind=engine)
    sess = session()
    # 生成的sql语句
    sql = sess.query(User).join(Group)
    print(sql)
    ret = sess.query(User).join(Group).all()  # 内部自动关联外键
    print(ret)
    # 左连接left join,默认为inner join
    res = sess.query(User).join(Group, isouter=True).all()
    print(res)
    多表查询
    from sqlalchemy import create_engine,and_,or_,func,Table
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String,ForeignKey,UniqueConstraint,DateTime
    from  sqlalchemy.orm import sessionmaker,relationship
    
    Base = declarative_base() #生成一个SqlORM 基类
    
    # 服务器账号和组
    # HostUser2Group = Table('hostuser_2_group',Base.metadata,
    #     Column('hostuser_id',ForeignKey('host_user.id'),primary_key=True),
    #     Column('group_id',ForeignKey('group.id'),primary_key=True),
    # )
    
    # 用户和组关系表,用户可以属于多个组,一个组可以有多个人
    UserProfile2Group = Table('userprofile_2_group',Base.metadata,
        Column('userprofile_id',ForeignKey('user_profile.id'),primary_key=True),
        Column('group_id',ForeignKey('group.id'),primary_key=True),
    )
    
    # 程序登陆用户和服务器账户,一个人可以有多个服务器账号,一个服务器账号可以给多个人用
    UserProfile2HostUser= Table('userprofile_2_hostuser',Base.metadata,
        Column('userprofile_id',ForeignKey('user_profile.id'),primary_key=True),
        Column('hostuser_id',ForeignKey('host_user.id'),primary_key=True),
    )
    
    
    class Host(Base):
        __tablename__='host'
        id = Column(Integer,primary_key=True,autoincrement=True)
        hostname = Column(String(64),unique=True,nullable=False)
        ip_addr = Column(String(128),unique=True,nullable=False)
        port = Column(Integer,default=22)
        def __repr__(self):
            return  "<id=%s,hostname=%s, ip_addr=%s>" %(self.id,
                                                        self.hostname,
                                                        self.ip_addr)
    
    
    class HostUser(Base):
        __tablename__ = 'host_user'
        id = Column(Integer,primary_key=True)
        AuthTypes = [
            (u'ssh-passwd',u'SSH/Password'),
            (u'ssh-key',u'SSH/KEY'),
        ]
        # auth_type = Column(ChoiceType(AuthTypes))
        auth_type = Column(String(64))
        username = Column(String(64),unique=True,nullable=False)
        password = Column(String(255))
    
        host_id = Column(Integer,ForeignKey('host.id'))
        
        # groups = relationship('Group',
        #                       secondary=HostUser2Group,
        #                       backref='host_list')
    
        __table_args__ = (UniqueConstraint('host_id','username', name='_host_username_uc'),)
    
        def __repr__(self):
            return  "<id=%s,name=%s>" %(self.id,self.username)
    
    
    class Group(Base):
        __tablename__ = 'group'
        id = Column(Integer,primary_key=True)
        name = Column(String(64),unique=True,nullable=False)
        def __repr__(self):
            return  "<id=%s,name=%s>" %(self.id,self.name)
    
    
    class UserProfile(Base):
        __tablename__ = 'user_profile'
        id = Column(Integer,primary_key=True)
        username = Column(String(64),unique=True,nullable=False)
        password = Column(String(255),nullable=False)
        # host_list = relationship('HostUser',
        #                       secondary=UserProfile2HostUser,
        #                       backref='userprofiles')
        # groups = relationship('Group',
        #                       secondary=UserProfile2Group,
        #                       backref='userprofiles')
        def __repr__(self):
            return  "<id=%s,name=%s>" %(self.id,self.username)
    
    
    class AuditLog(Base):
        __tablename__ = 'audit_log'
        id = Column(Integer,primary_key=True)
        userprofile_id = Column(Integer,ForeignKey('user_profile.id'))
        hostuser_id = Column(Integer,ForeignKey('host_user.id'))
        action_choices2 = [
            (u'cmd',u'CMD'),
            (u'login',u'Login'),
            (u'logout',u'Logout'),
        ]
        action_type = Column(ChoiceType(action_choices2))
        #action_type = Column(String(64))
        cmd = Column(String(255))
        date = Column(DateTime)
    
        # user_profile = relationship("UserProfile")
        #bind_host = relationship("BindHost")
    
    
    engine = create_engine("mysql+pymsql://root:123@localhost:3306/stupid_jumpserver",echo=False)
    Base.metadata.create_all(engine) #创建所有表结构
    表结构操作联系

    更多请查看:http://www.cnblogs.com/wupeiqi/articles/5699254.html

  • 相关阅读:
    Verilog开发之“新Iverilog工具认识”
    苹果开发之“swift简单按钮加1计数入门”
    基于现有.net core框架模版修改
    Sql50语句小练
    因有个社区:入了一个新的时代!
    .Net Core下建立web应用的 路由器修改
    一个网站的渗透测试思路,流程(给你一个网站,怎么做?)
    windows服务
    我知道的代码生成器
    Extjs 自动列宽
  • 原文地址:https://www.cnblogs.com/caibao666/p/6862632.html
Copyright © 2011-2022 走看看