SQLAlchemy安装
-
安装
-
pip install sqlalchemy -i https://pypi.douban.com/simple
-
连接的时候依赖pymysql
通过SQLAlchemy连接数据库
-
from sqlalchemy import create_engine
-
-
# 数据库的配置变量
-
HOSTNAME = '127.0.0.1'
-
PORT = '3306'
-
DATABASE = 'xt_flask'
-
USERNAME = 'root'
-
PASSWORD = 'root'
-
DB_URI = 'mysql+mysqldb://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)
-
-
# 创建数据库引擎
-
engine = create_engine(DB_URI)
-
-
#创建连接
-
with engine.connect() as con:
-
rs = con.execute('SELECT 1')
-
print rs.fetchone()
-
-
首先从sqlalchemy中导入create_engine,用这个函数来创建引擎,然后用engine.connect()来连接数据库。其中一个比较重要的一点是,通过create_engine函数的时候,需要传递一个满足某种格式的字符串,对这个字符串的格式来进行解释:
-
-
dialect+driver://username:password@host:port/database
-
dialect是数据库的实现,比如MySQL、PostgreSQL、SQLite,并且转换成小写。driver是Python对应的驱动,如果不指定,会选择默认的驱动,比如MySQL的默认驱动是MySQLdb。username是连接数据库的用户名,password是连接数据库的密码,host是连接数据库的域名,port是数据库监听的端口号,database是连接哪个数据库的名字。
-
-
如果以上输出了1,说明SQLAlchemy能成功连接到数据库。
SQLAlchemy参数
-
Column常用参数:
-
default:默认值。
-
nullable:是否可空。
-
primary_key:是否为主键。
-
unique:是否唯一。
-
autoincrement:是否自动增长。
-
onupdate:更新的时候执行的函数。
-
name:该属性在数据库中的字段映射。
-
-
sqlalchemy常用数据类型:
-
Integer:整形。
-
Float:浮点类型。
-
Boolean:传递True/False进去。
-
DECIMAL:定点类型。
-
enum:枚举类型。
-
Date:传递datetime.date()进去。
-
DateTime:传递datetime.datetime()进去。
-
Time:传递datetime.time()进去。
-
String:字符类型,使用时需要指定长度,区别于Text类型。
-
Text:文本类型。
-
LONGTEXT:长文本类型。
-
-
query可用参数:
-
模型对象。指定查找这个模型中所有的对象。
-
模型中的属性。可以指定只查找某个模型的其中几个属性。
-
聚合函数。
-
func.count:统计行的数量。
-
func.avg:求平均值。
-
func.max:求最大值。
-
func.min:求最小值。
-
func.sum:求和。
创建表
-
# -*- coding: utf-8 -*-
-
from sqlalchemy.ext.declarative import declarative_base
-
from sqlalchemy import Column # 列
-
from sqlalchemy import Integer, String # 属性
-
-
Base = declarative_base() # django models
-
-
# 创建表
-
class User(Base):
-
__tablename__ = 'user'
-
id = Column(Integer, primary_key=True, autoincrement=True)
-
name = Column(String(32), index=True, name='名字')
-
-
-
# 数据库连接
-
from sqlalchemy import create_engine
-
engine = create_engine("mysql+pymysql://root:redhat@192.168.32.71:3306/my_sql?charset=utf8")
-
-
# 去engine数据库中创建所有继承Base的表
-
Base.metadata.create_all(engine)
增加数据
-
# -*- coding: utf-8 -*-
-
from .create import engine, User
-
# 增加数据
-
# 创建会话窗口
-
from sqlalchemy.orm import sessionmaker
-
Session = sessionmaker(engine)
-
# 打开会话窗口
-
db_session = Session()
-
-
# ---单条数据
-
user_obj = User(name='Ywb') # 实例化
-
db_session.add(user_obj) # 相当于 insert into
-
-
# 执行会化窗口中的所有操作
-
db_session.commit()
-
db_session.close()
-
-
# ---增加批量数据
-
db_session.add_all([
-
User(name='peach'),
-
User(name='小红')
-
])
-
-
db_session.commit()
-
db_session.close()
-
-
# ---扩展
-
user1 = User(name='11')
-
user2 = User(name='12')
-
user3 = User(name='13')
-
user4 = User(name='14')
-
db_session.add(user1)
-
db_session.add(user2)
-
db_session.add(user3)
-
db_session.add(user4)
-
db_session.commit() # 全部添加进去
-
db_session.close()
过滤
-
过滤是数据提取的一个很重要的功能,以下对一些常用的过滤条件进行解释,并且这些过滤条件都是只能通过filter方法实现的:
-
-
equals:
-
query.filter(User.name == 'ed')
-
-
not equals:
-
query.filter(User.name != 'ed')
-
-
like:
-
query.filter(User.name.like('%ed%'))
-
-
in:
-
query.filter(User.name.in_(['ed','wendy','jack']))
-
# 同时,in也可以作用于一个Query
-
query.filter(User.name.in_(session.query(User.name).filter(User.name.like('%ed%'))))
-
-
not in:
-
query.filter(~User.name.in_(['ed','wendy','jack']))
-
-
is null:
-
query.filter(User.name==None)
-
# 或者是
-
query.filter(User.name.is_(None))
-
-
is not null:
-
query.filter(User.name != None)
-
# 或者是
-
query.filter(User.name.isnot(None))
-
-
and:
-
from sqlalchemy import and_
-
query.filter(and_(User.name=='ed',User.fullname=='Ed Jones'))
-
# 或者是传递多个参数
-
query.filter(User.name=='ed',User.fullname=='Ed Jones')
-
# 或者是通过多次filter操作
-
query.filter(User.name=='ed').filter(User.fullname=='Ed Jones')
-
-
or:
-
from sqlalchemy import or_
-
query.filter(or_(User.name=='ed',User.name=='wendy'))
单表查询
-
# -*- coding: utf-8 -*-
-
# 单表查询
-
from sqlalchemy.orm import sessionmaker
-
from SQLAlchemy.create import engine, User
-
Session = sessionmaker(engine)
-
db_session = Session()
-
-
# ---基本查询
-
# select * from name
-
user_list = db_session.query(User)
-
print(user_list) # SELECT user.`名字` AS `user_名字`, user.id AS user_id FROM user
-
-
# ---------------- 所有数据 ------------------
-
user_list = db_session.query(User).all() # [obj, obj]
-
for usr in user_list:
-
print(usr.name)
-
-
# ---------------- 一条数据 ------------------
-
user = db_session.query(User).first() # obj
-
print(user.name)
-
-
-
# ---------------- 带条件查询 ------------------
-
# --- filter
-
user_list = db_session.query(User).filter(User.id==2).all() # [obj, obj]
-
print(user_list)
-
-
user_list = db_session.query(User).filter(User.id >= 1).all() # [obj, obj]
-
for user in user_list:
-
print(user.id) # 按照id排序,因为添加是id
-
-
# --- filter_by
-
user = db_session.query(User).filter_by(id=2).first() # obj
-
print(user)
-
-
# --- 扩展-查看sql语句
-
sql = db_session.query(User).filter(User.id >= 1)
-
print(sql)
-
"""
-
SELECT user.`名字` AS `user_名字`, user.id AS user_id
-
FROM user
-
WHERE user.id >= %(id_1)s
-
"""
修改
-
# -*- coding: utf-8 -*-
-
# 更新修改数据
-
from sqlalchemy.orm import sessionmaker
-
from SQLAlchemy.create import engine,User
-
Session = sessionmaker(engine)
-
db_session = Session()
-
-
# 单条修改
-
# update `uesr` set `name` = 'haha' where id =1
-
res = db_session.query(User).filter(User.id==1).update({
-
"name": 'haha'
-
})
-
-
print(res) # 返回影响的行数
-
db_session.commit()
-
db_session.close()
-
-
# 批量修改
-
res = db_session.query(User).filter(User.id > 1).update({
-
"name": "1234"
-
})
-
-
print(res)
-
db_session.commit()
-
db_session.close()
删除
-
# -*- coding: utf-8 -*-
-
# 删除数据
-
from sqlalchemy.orm import sessionmaker
-
from SQLAlchemy.create import engine,User
-
Session = sessionmaker(engine)
-
db_session = Session()
-
-
# 删除单条
-
# delete from user where id = 1
-
res = db_session.query(User).filter(User.id==1).delete()
-
print(res) # 返回影响的行数
-
db_session.commit()
-
db_session.close()
-
-
-
# 删除多条
-
res = db_session.query(User).filter(User.name=="12345").delete()
-
print(res)
-
db_session.commit()
-
db_session.close()