ORM框架之Sqlalchemy

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()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章