SQLAlchemy是Python的ORM库,支持多种数据库。
建立连接
连接MySQL要用到Engine,Engine集成了连接池pool和方言Dialect(支持不通数据库的SQL语法),最后都统一成标准DBAPI。
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://user:pass@localhost/test', echo=True)
create_engine第一个参数是database url,用到了pymysql驱动。
第二个参数echo用于打印执行中的关键日志,包括SQL执行语句。
建立映射
sqlalchemy把表table映射成model class,把字段field映射成column,把记录record映射成实例instance。
手动创建映射
from sqlalchemy.sql.schema import Column
from sqlalchemy.types import BigInteger, String, Integer
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(BigInteger, primary_key=True)
name = Column(String(255))
age = Column(Integer)
gender = Column(String(255))
另外可以使用sqlacodegen(pip install sqlacodegen)自动生成model:
sqlacodegen mysql+pymysql://user:password@localhost/test --outfile=models.py --tables users
# coding: utf-8
from sqlalchemy import Column, String
from sqlalchemy.dialects.mysql import BIGINT, INTEGER
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
metadata = Base.metadata
class User(Base):
__tablename__ = 'users'
id = Column(BIGINT(20), primary_key=True)
name = Column(String(255, 'utf8_unicode_ci'))
age = Column(INTEGER(11))
gender = Column(String(255, 'utf8_unicode_ci'))
自动创建映射
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql.schema import Table
Base = declarative_base()
metadata = Base.metadata
metadata.bind = engine
class User(Base):
__table__ = Table('users', metadata, autoload=True)
设置autoload就可以自动生成映射,另外Base.metadata需要提前绑定engine。
查询
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
query = session.query(User).filter(User.age >= 19).filter(User.name.like("王%"))
for user in query.all():
print(user.age)
查询用到了Session对象,类似一个容器,容器里是identity map
的结构对象。
用filter过滤数据。
新增
user1 = User()
user1.name = "赵六"
user1.age = 21
user1.gender = "女"
session.add(user1)
session.commit()
先建立一个User实例,然后调用session的add方法,最后commit。
更新
user2 = session.query(User).filter_by(name='赵六').first()
user2.gender = "男"
session.commit()
先查找到User实例,然后修改实例属性,最后调用session的commit修改数据库。
删除
user3 = session.query(User).filter_by(name='赵六').first()
session.delete(user3)
session.commit()
多表查询
Session = sessionmaker(bind=engine)
session = Session()
query = session.query(User).join(Address, User.id == Address.user_id)
for user in query.all():
print(user.age)
这里用了join方法。