前沿

对象关系映射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

 

Logo

更多推荐