zoukankan      html  css  js  c++  java
  • python ORM之sqlalchemy

    前沿
    对象关系映射ORM是在实际应用编程中常用到的技术,它在对象和关系之间建立了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化。简单来说就是开发人员在使用ORM模型编程时,不需要再编写SQL语句来操作数据库,而是使用一系列的函数和方法来完成对数据库的操作。

    Python目前比较流行的ORM框架主要是SQLAlchemy框架,它可以兼容MySQL、SQLite、Oracle等多种关系型数据库。

    准备工作
    安装SQLAlchemy框架

    pip3 install sqlalchemy
    连接数据库
    SqlAlchemy模块在连接数据库时需要指定一个连接URI,用于指明数据库的类型以及账号密码等参数,其格式为:

    (1)MySQL数据库

    mysql+frameworkname://username:password@address:port/databasename
    参数解释:

    frameworkname:连接数据库使用的模块名,本节使用的是PyMySQL;
    username:数据库用户名;
    password:连接密码;
    address:连接地址;
    port:端口;
    databasename:数据库名。
    (2)SQLite数据库

    #Unix/Mac系统

    sqlite:////absolutepath/dbname.db

    #Windows系统

    sqlite:///C:\absolutepath\dbname.db
    参数解释:

    absolutepath:绝对路径;
    dbname:数据库文件名。
    示例

    # connect_orm.py
    from sqlalchemy import create_engine

    try:
    # 连接MySQL数据库,地址:localhost:3306,账号:root,密码:123,数据库:test
    MySQLEngine=create_engine('mysql+pymysql://root:123@localhost:3306/test?charset=utf8', encoding='utf-8')
    print('连接MySQL数据库成功', MySQLEngine)
    # 连接SQLite数据库,如果当前目录不存在test.db文件则会自动生成
    SQLiteEngine = create_engine('sqlite:///:test.db', encoding='utf-8')
    print('连接SQLite数据库成功', SQLiteEngine)
    except Exception as e:
    print('连接数据库失败', e)
    程序执行的结果为:

    连接MySQL数据库成功Engine(mysql+pymysql://root:***@localhost:3306/student?charset=utf8)
    连接SQLite数据库成功 Engine(sqlite:///:test.db)
    增、删、改、查
    1.创建数据库表
    待创建的STUDENT表:

    列名

    类型

    备注

    SNO

    CHAR(10)

    NOT NULL

    SNAME

    CHAR(20)

    主键

    程序: 

    # create_table_orm.py
    from sqlalchemy import Column, String, create_engine
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.ext.declarative import declarative_base

    # 创建基类
    BASE = declarative_base()

    # 定义学生对象
    class Student(BASE):
    # 表的名字:STUDENT
    __tablename__ = 'STUDENT'
    # 学号
    sno = Column(String(10))
    # 姓名
    sname = Column(String(20), primary_key=True)
    # 创建表的参数
    __table_args__ = {
    "mysql_charset": "utf8"
    }

    try:
    # 连接MySQL数据库,地址:localhost:3306,账号:root,密码:123,数据库:test
    MySQLEngine=create_engine('mysql+pymysql://root:123@localhost:3306/test?charset=utf8', encoding='utf-8')
    # 创建STUDENT表
    BASE.metadata.create_all(MySQLEngine)
    print('创建STUDENT表成功')
    except Exception as e:
    print("连接SQLite数据库失败", e)
    2.插入数据
    # insertData_orm.py
    from sqlalchemy import Column, String, create_engine
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.ext.declarative import declarative_base

    # 创建基类
    BASE = declarative_base()

    # 定义学生对象
    class Student(BASE):
    # 表的名字:STUDENT
    __tablename__ = 'STUDENT'
    # 学号
    sno = Column(String(10))
    # 姓名
    sname = Column(String(20), primary_key=True)
    # 创建表的参数
    __table_args__ = {
    "mysql_charset": "utf8"
    }

    try:
    # 连接MySQL数据库
    MySQLEngine=create_engine('mysql+pymysql://root:123@localhost:3306/test?charset=utf8', encoding='utf-8')
    # 创建MySQL类型
    MySQLSession = sessionmaker(bind=MySQLEngine)
    # 创建session对象
    session = MySQLSession()

    # 使用ORM插入数据
    # 创建Student对象
    Stu = Student(sname='张三', sno='2016081111')
    # 将创建的对象添加进session中
    session.add(Stu)

    # 使用原生SQL插入数据
    session.execute(
    "INSERT INTO STUDENT VALUES('2016081115','吴芳'),('2016081116','胡月')")
    # 提交到数据库
    session.commit()
    # 关闭session
    session.close()
    print('插入数据成功')
    except Exception as e:
    print("连接SQLite数据库失败", e)
    3.查询数据
    # selectData_orm.py
    from sqlalchemy import Column, String, create_engine
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.ext.declarative import declarative_base

    # 创建基类
    BASE = declarative_base()

    # 定义学生对象
    class Student(BASE):
    # 表的名字:
    __tablename__ = 'STUDENT'

    sname = Column(String(20), primary_key=True)
    sno = Column(String(10))

    def __str__(self): # 格式输出查询出的数据
    return '%s,%s' % (self.sname, self.sno)

    try:
    # 连接MySQL数据库
    MySQLEngine=create_engine('mysql+pymysql://root:123@localhost:3306/test?charset=utf8', encoding='utf-8')
    # 创建MySQL类型
    MySQLSession = sessionmaker(bind=MySQLEngine)
    # 创建session对象
    session = MySQLSession()
    # 查询学号为2016081111的学生
    Stu = session.query(Student).filter(Student.sno == '2016081111')
    # 查询所有数据
    Stus = session.query(Student).all()
    print('查询结果的类型:', type(Stu))
    print('STUDENT表所有的数据:')
    for row in Stus:
    print(row)
    # 关闭session
    session.close()
    except Exception as e:
    print("连接SQLite数据库失败", e)
    程序执行结果:

    查询结果的类型: <class 'sqlalchemy.orm.query.Query'>
    STUDENT表所有的数据:
    吴芳,2016081115
    张三,2016081111
    胡月,2016081116
    4.修改数据
    # selectData_orm.py
    from sqlalchemy import Column, String, create_engine
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.ext.declarative import declarative_base

    # 创建基类
    BASE = declarative_base()

    # 定义学生对象
    class Student(BASE):
    # 表的名字:
    __tablename__ = 'STUDENT'

    sname = Column(String(20), primary_key=True)
    sno = Column(String(10))

    def __str__(self): # 格式输出查询出的数据
    return '%s,%s' % (self.sname, self.sno)

    try:
    # 连接MySQL数据库
    MySQLEngine=create_engine('mysql+pymysql://root:123@localhost:3306/test?charset=utf8', encoding='utf-8')
    # 创建MySQL类型
    MySQLSession = sessionmaker(bind=MySQLEngine)
    # 创建session对象
    session = MySQLSession()
    # 查询学号为2016081111的学生
    Stu = session.query(Student).filter(Student.sno == '2016081111').first()
    print('更改前:', Stu)
    # 更改姓名为李华
    Stu.sname = '李华'
    # 提交到数据库
    session.commit()
    print('更改后:', Stu)
    # 关闭session
    session.close()
    except Exception as e:
    print("连接SQLite数据库失败", e)
    程序执行结果:

    更改前: 张三,2016081111
    更改后: 李华,2016081111
    5.删除数据
    # deleteData_orm.py
    from sqlalchemy import Column, String, create_engine
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.ext.declarative import declarative_base

    # 创建基类
    BASE = declarative_base()

    # 定义学生对象
    class Student(BASE):
    # 表的名字:
    __tablename__ = 'STUDENT'

    sname = Column(String(20), primary_key=True)
    sno = Column(String(10))

    def __str__(self): # 格式输出查询出的数据
    return '%s,%s' % (self.sname, self.sno)

    try:
    # 连接MySQL数据库
    MySQLEngine=create_engine('mysql+pymysql://root:123@localhost:3306/test?charset=utf8', encoding='utf-8')
    # 创建MySQL类型
    MySQLSession = sessionmaker(bind=MySQLEngine)
    # 创建session对象
    session = MySQLSession()
    # 查询学号为2016081111的学生
    before = session.query(Student).filter(Student.sno == '2016081111').first()
    print('删除前:', before)
    # 删除数据
    session.query(Student).filter(Student.sno == '2016081111').delete()
    # 提交到数据库
    session.commit()
    after = session.query(Student).filter(Student.sno == '2016081111').first()
    print('删除后:', after)
    # 关闭session
    session.close()
    except Exception as e:
    print("连接SQLite数据库失败", e)
    程序执行结果:

    删除前: 李华,2016081111
    删除后: None
     

  • 相关阅读:
    Linux远程执行Shell代码
    docker启动时nginx与php-fpm
    给IIS安装ASP.NET 5.0 core功能
    React学习目录
    基于pgpool搭建postgressql集群部署
    react-redux的使用
    redux的使用
    render props和Error boundary(错误边界)
    context和optimize优化
    hook和Fragment
  • 原文地址:https://www.cnblogs.com/aibabel/p/11489566.html
Copyright © 2011-2022 走看看