ORM 基础
1. 安装模块
还需要安装数据库驱动,这里安装的是 pymysql
,用来驱动 MYSQL
数据库。
pip install sqlalchemy
pip install pymysql
2. 概念和数据类型
2.1 概念
概念 | 对应数据库 | 说明 |
---|---|---|
Engine | 连接 | 驱动引擎 |
Session | 事务 | 由此开始查询 |
Model | 表 | 类 |
Column | 列 | 类属性 |
Model() | 记录 | Model 类的实例对象 |
2.2 数据类型
数据类型 | 数据库数据类型 | Python数据类型 | 说明 |
---|---|---|---|
Integer | int | int | 整型,32位 |
String | varchar | string | 字符串 |
Text | text | string | 长字符串 |
Float | float | float | 浮点型 |
Boolean | tinyint | bool | True/False |
Date | date | datatime.date | 储存时间年月日 |
DateTime | datetime | datetime.datetime | 储存年月日时分秒毫秒等 |
Time | time | datetime.datetime | 储存时分秒 |
JSON | JSON | JSON | JSON 类型 |
3. 常用包
3.1 create_engine
建立连接-引擎
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://用户名:密码@IP地址:端口号/数据库名')
利用引擎连接 MySQL
数据库
HOST = 'localhost'
PORT = 3306
USERNAME = 'root'
PASSWORD = '123456'
DB = 'myclass'
# dialect + driver://username:passwor@host:port/database
DB_URI = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DB}'
engine = create_engine("mysql://user:password@hostname/dbname?charset=utf8",
echo=True,
pool_size=8,
pool_recycle=60*30
)
- echo: 当设置为
True
时会将 ORM 语句转化为 SQL 语句打印,一般 debug 的时候可用 - pool_size: 连接池的大小,默认为5个,设置为0时表示连接无限制
- pool_recycle: 设置时间以限制数据库多久没连接自动断开
这个 echo
标志是设置 sqlachemy 日志的快捷方式,它是通过python的标准实现的。 logging
模块。启用它后,我们将看到生成的所有 SQL。如果您正在学习本教程并希望生成的输出更少,请将其设置为 False
。 本教程将在弹出窗口后面格式化 SQL,这样它就不会妨碍我们的工作;只需单击 “SQL” 链接查看正在生成的内容。
例如:
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:123456@10.13.24.249:3306/database', echo=True)
3.2 declarative_base
声明映射
from sqlalchemy.orm import declarative_base
Base = declarative_base()
以后新建的模型都继承这个类
使用声明性系统映射的类是根据一个基类定义的,该基类维护一个与该基相关的类和表的目录,这称为声明性基类. 我们的应用程序在一个通常导入的模块中通常只有这个基的一个实例。
既然我们有了一个“基”,就可以根据它定义任意数量的映射类。我们从一张叫 users
,它将使用我们的应用程序为最终用户存储记录。一个名为 User
将是我们映射此表的类。在类中,我们定义了要映射到的表的详细信息,主要是表名以及列的名称和数据类型:
from sqlalchemy import Column, Integer, String
class User(Base):
__tablename__ = 'users' # 表名
id = Column(Integer, primary_key=True) # 定义主键
name = Column(String)
fullname = Column(String)
nickname = Column(String)
def __repr__(self):
return "<User(name='%s', fullname='%s', nickname='%s')>" % (
self.name, self.fullname, self.nickname)
3.3 Column
引入字段
from sqlalchemy import Column
3.4 Integer, String, JSON
引入数据类型
from sqlalchemy import Integer, String, JSON
String
类型需要标注长度,例如:String(50)
3.5 ForeignKey
引入外键
from sqlalchemy import ForeignKey
3.6 relationship, backref
引入关系
from sqlalchemy.orm import relationship, backref
3.7 func
引入数据库函数
from sqlalchemy import func
3.8 MYSQL 数据类型
from sqlalchemy.dialects.mysql import \
BIGINT, BINARY, BIT, BLOB, BOOLEAN, CHAR, DATE, \
DATETIME, DECIMAL, DECIMAL, DOUBLE, ENUM, FLOAT, INTEGER, \
LONGBLOB, LONGTEXT, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, NCHAR, \
NUMERIC, NVARCHAR, REAL, SET, SMALLINT, TEXT, TIME, TIMESTAMP, \
TINYBLOB, TINYINT, TINYTEXT, VARBINARY, VARCHAR, YEAR
3.9 Session
sqlalchemy 中使用 session
用于创建程序和数据库之间的会话,所有对象的载入和保存都需要通过 session
对象 。
通过 sessionmaker
调用创建一个工厂,并关联 Engine
以确保每个 session
都可以使用该 Engine
连接资源:
from sqlalchemy.orm import sessionmaker
# 创建session
DbSession = sessionmaker(bind=engine) # 定义一个 Session 类,其中包括了引擎的信息
session = DbSession() # 通过 Session 类实例化一个 session 对象用来操作数据库
session 的常见操作方法包括:
- flush:预提交,提交到数据库文件,还未写入数据库文件中
- commit:提交了一个事务
- rollback:回滚
- close:关闭
- execute : 执行查询语句
可以用上下文管理器来操作 session:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
# an Engine, which the Session will use for connection
# resources
engine = create_engine('postgresql://scott:tiger@localhost/')
# a sessionmaker(), also in the same scope as the engine
Session = sessionmaker(engine)
# we can now construct a Session() and include begin()/commit()/rollback()
# at once
with Session.begin() as session:
session.add(some_object)
session.add(some_other_object)
# commits the transaction, closes the session
评论区(暂无评论)