Python中通过SQLAlchemy操作数据库。
安装
通过pip安装SQLAlchemy
1 | $ pip install sqlalchemy |
初始化数据库连接
1 | # 初始化数据库连接 |
其中,echo=True
表示 是否将执行过程中的sql语句进行输出显示
常用数据库连接写法
整理常用-直接拷贝
- sqlite内存:
engine = create_engine('sqlite:///:memory:', echo=True)
- sqlite文件:
engine=create_engine('sqlite:///./cnblogblog.db',echo=True)
- mysql+pymysql:
engine = create_engine("mysql+pymysql://username:password@hostname:port/dbname",echo=True)
- mssql+pymssql:
engine = create_engine('mssql+pymssql://username:password@hostname:port/dbname',echo=True)
1 | >>> from sqlalchemy import create_engine |
create_engine()
用来初始化数据库连接。SQLAlchemy用一个字符串表示连接信息:
1 | '数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名' |
- sqlite 内存 示例
engine = create_engine('sqlite:///:memory:', echo=True)
- sqlite 文件 示例
engine=create_engine('sqlite:///./cnblogblog.db',echo=True)
- mysql通用
engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')
- mysql+pymysql 示例
engine = create_engine("mysql+pymysql://username:password@hostname/dbname", encoding="utf8", echo=True)
- postgresql 示例
engine = create_engine('postgresql://scott:tiger@localhost:5432/mydatabase')
PostgreSQL
1 | # default |
MySQL
1 | # default |
Oracle
1 | engine = create_engine('oracle://scott:tiger@127.0.0.1:1521/sidname') |
MS SQL
1 | # pyodbc |
SQLite
1 | # sqlite://<nohostname>/<path> |
详见官网文档:Engine Configuration
如何设置初始化表结构时字段的 主键
自增
等属性
sqlite中如果设置主键自增,还需要添加 __table_args__
参数,示例如下:
1 | class Person(Base): |
设置表结构的 不可空
默认值
唯一
等属性
1 | # 定义User对象 |
插入中文数据
直接插入中文数据,可能会报如下错误信息:
sqlalchemy.exc.ProgrammingError: (sqlite3.ProgrammingError) You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.
相应的解决方法是:将 str
类型的中文转成 unicode
类型再插入即可。
示例代码如下:
1 | # 添加一条数据 |
参考自:
Python 官方文档中不建议使用这种方式:use of sys.setdefaultencoding() has always been discouraged,在文件头写上 # coding: utf-8 之类的注释并且在 Unicode 字符串前加上
u
就可以了。
Mysql 指定表的引擎和编码格式
1 | from sqlalchemy import Column, Integer, String |
如果记录存在则修改,不存在则添加
1 | session.merge() |
模型的属性名称和表的字段名称不一致
1 | id=Column("id",Integer,primary_key=True,autoincrement=True) |
增删改 查询
增删改需要 commit
操作 :
1 | session=DBSession() |
查询不需要 commit
操作:
1 | session=DBSession() |
first() 和 one() 的区别
query.first():返回第一个元素
query.one()有且只有一个元素时才正确返回
first()方法限制并仅作为标量返回结果集的第一条记录
one()方法,完整的提取所有的记录行,并且如果没有明确的一条记录行(没有找到这条记录)或者结果中存在多条记录行,将会引发错误异常NoResultFound或者MultipleResultsFound。
当没有数据行返回时,使用 one()
方法会报错,可以使用 one_or_none()
方法来代替,当没有数据时,会返回 None
而不是异常。
执行sql语句
绑定参数也可以用基于字符串的SQL指派,使用冒号来标记替代参数,然后再使用params()方法指定相应的值。
1 | session.query(User).filter("id<:value and name=:name").\ |
execute() 方法
1 | s=DBSession() |
可参考:python - How to execute raw SQL in SQLAlchemy-flask app - Stack Overflow
执行sql语句 高级
- 执行sql语句,可以使用传统的
connection
方式,也可以使用session
方式 - sqlalchemy下的传统connection方式,执行sql语句时不需要
cursor
光标,执行增删改直接生效,执行sql语句不需要commit
操作。 - sqlalchemy下的传统connection方式,参数形式与传统方式相同,使用
?
占位,元祖形式传值 - sqlalchemy下的session方式,执行增删改需要
commit
操作。 - sqlalchemy下的session方式,参数形式为 dict, 在sql语句中使用
:key
占位,dict形式传值
示例代码
1 | # **传统 connection方式** |
详情可见:sqlalchemy学习笔记 - python学习笔记 - SegmentFault
完整测试代码
1 | # coding:utf-8 |
sqlalchemy 教程
入门
- Test.py
- 作为一个Pythoner,不会SQLAlchemy ☆
- SQLAlchemy ORM教程之一:Create - 简书 ☆
- SQLAlchemy ORM教程之二:Query - 简书 ☆
- SQLAlchemy ORM教程之三:Relationship - 简书 ☆
增删改查常用命令
- sqlalchemy学习笔记 - python学习笔记 - SegmentFault ☆
- SQLAlchemy 使用经验
- note/sqlalchemy.md at master · lzjun567/note · GitHub