SQLAlchemy是Python編程語言下的一款開源軟件,提供了SQL工具包及對象關係映射(ORM)工具,使用MIT許可證發行。SQLAlchemy採用簡單的Python語言,爲高效和高性能的數據庫訪問設計,實現了完整的企業級持久模型。
本文將對sqlalchemy的基本使用進行介紹。
Demo準備
依賴配置
在requriments.txt中配置依賴:
MySQL-python==1.2.5
SQLAlchemy==1.2.15
在src目錄下創建settings文件,讀取配置信息:
import ConfigParser
import os
import argparse
parser = argparse.ArgumentParser(description='Start servers.')
configuration = ConfigParser.ConfigParser()
# 從命令行讀取參數,無config參數時取默認值config
parser.add_argument('-c', '--config', dest='config', default='config', help='specify the location of the config file')
parser.add_argument('-a', '--arg', dest='arg', help='other args.')
args = parser.parse_args()
# 當config參數合法時,讀取配置文件參數,並將命令行arg參數添加到main中.
# 可通過settings.args.arg或settings.get('main', 'arg')取出
if os.path.exists(args.config):
configuration.read(args.config)
if args.arg:
configuration.set('main', 'arg', value=args.arg)
else:
parser.print_help()
def getint(section, option):
return configuration.getint(section, option)
def get(section, option):
return configuration.get(section, option)
def getboolean(section, option):
return configuration.getboolean(section, option)
def getfloat(section, option):
return configuration.getfloat(section, option)
def set(section, option, value=None):
return configuration.set(section, option, value=value)
config(無文件後綴)如下(echo爲True表示打開logging):
[main]
debug = true
[mysql]
host = mysql://[user]:[password]@[host]:[port]/[dbname]?charset=utf8
charset = utf-8
echo = false
創建mysql_base.py,用於連接數據庫:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import settings
Base = declarative_base()
mysql_engine = create_engine(
settings.get('mysql', 'host'),
echo=settings.getboolean('mysql', 'echo'),
encoding=settings.get('mysql', 'charset')
)
Session = sessionmaker(bind=mysql_engine)
session = Session()
session.execute('show databases')
創建一個orm映射, 一個映射對應一個Python類,用來表示一個表的結構。 下面創建一個Person表,包括id和name兩個字段:
from base.mysql_base import Base, session
from sqlalchemy import *
class Person(Base):
__tablename__ = 'person'
id = Column(BigInteger, primary_key=True, autoincrement=True)
name = Column(String(64), nullable=False)
創建一個Address表,包括id,name和person_id字段:
class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String, nullable=False)
person_id = Column(Integer, nullable=False)
CURD操作
# 新增單條數據
session.add(Person(name=’jack’))
# 新增多條數據
session.add_all([Person(name=’mike’), Person(name=’siri’)])
session.commit()
session.query(Person).limit(100).all()
# 按條件查詢
session.query(Person).filter(Person.name == ‘jack’).all()
# 查詢第一條
session.query(Person).first()
# 過濾和limit
session.query(Person.name).filter(Person.id > 1).all()[1:3]
# 排序
session.query(Person).order_by(-Person.id).limit(10).all()
session.query(Person).order_by(desc(Person.id)).limit(10).all()
# 模糊查詢
query = session.query(Person)
query.filter(Person.name.like(‘%ac%’)).all()
query.filter(Person.id.in_([1, 2, 3])).all()
# and or
query.filter(Person(Person.id == 1, Person.name == ‘jack’)).all()
query.filter(and_(Person.id == 1, Person.name == ‘jack’)).all()
query.filter(Person.id == 1).filter(Person.name == ‘jack’).all()
query.filter(or_(Person.id == 1, Person.id == 2)).all()
# 使用text自定義sql
query.filter(text(“id”> 1)).all()
query.filter(text(“id > :id”)).params(id = 1).all()
query.from_statement(text(“select * from person where name = :name”)).params(name= ‘jack’).all()
# count 和 group
query.filter(Person.id > 1).count()
session.query(func.count(Person.id)).scalar()
session.query(func.count(‘*’)).select_from(Person).scalar()
session.query(func.count(Person.name), Person.name).group_by(Person.name).all()
# 連表查詢和統計
sql_from = Person.__table__.join(Address.__table__, Person.id == Address.person_id)
sql = select([func.count()]).select_from(sql_from).where(Person.name == 'jack')
count = session.execute(sql).scalar()
docs = session.query(Person.id, Person.name, Address.name).select_from(sql_from).filter(Person.name == 'jack').all()