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