SQLAlchemy
在使用Python操作數(shù)據(jù)庫時擂涛,可以使用SQLAlchemy庫:
SQLAlchemy 是python 操作數(shù)據(jù)庫的一個庫顾稀。能夠進(jìn)行 orm 映射官方文檔 sqlchemy
SQLAlchemy“采用簡單的Python語言银择,為高效和高性能的數(shù)據(jù)庫訪問設(shè)計津坑,實(shí)現(xiàn)了完整的企業(yè)級持久模型”渗饮。SQLAlchemy的理念是姻政,SQL數(shù)據(jù)庫的量級和性能重要于對象集合呆抑;而對象集合的抽象又重要于表和行
安裝和初始化
pip安裝命令
pip install sqlalchemy
檢查是否安裝成功
>>>import sqlalchemy
>>>sqlalchemy.__version__
'1.2.10'
>>>
顯示版本號1.2.10,這樣就說明安裝成功了
使用sqlalchemy對數(shù)據(jù)庫操作
定義元信息汁展,綁定到引擎
>>> from sqlalchemy import *
>>> from sqlalchemy.orm import *
>>> engine = create_engine('sqlalchemy.db', echo=True) #定義引擎
>>> metadata = MetaData(engine) # 綁定元信息
>>>
創(chuàng)建表
>>> users_table = Table('users', metadata,
... Column('id', Integer, primary_key=True),
... Column('name', String(40)),
... Column('email', String(120)))
>>>
>>> users_table.create()
>>> users_table = Table('users', metadata, autoload=True)
插入數(shù)據(jù)
>>>i = users_table.insert()
>>>i.execute(name='linyk3', email='linyk2655@126.com')
建立ORM映射
class User(db.Model):
__tablename__ = "user_table"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(40))
email = db.Column(db.String(120))
def __repr__(self):
return '%s(%r, %r)' % (self.__class__.__name__, self.name, self.email)
建立會話
>>> session = create_session()
>>> query = session.query(User)
>>> u = query.filter_by(name='linyk3').first()
如果有多個查詢條件鹊碍,并且查詢條件不確定
可以使用下面查詢:
def get_user(id=None, name=None, email=None, page=None):
q = self.session.query(User)
if id:
q = q.filter(User.id == id)
if name:
q = q.filter(User.name == name)
if email:
q = q.filter(User.email == email)
if page:
q = q.limit(page * pageSize)
return q.all()
還可以使用filter_by,但是不支持比較運(yùn)算符
filters = {'name': 'linyk3', 'email': 'linyk2655@126.com'}
User.query.filter_by(**filters).first()
filter比filter_by的功能更強(qiáng)大,支持比較運(yùn)算符食绿,支持or_侈咕、in_等語法,如果表中有其他字段需要判斷,例如年齡器紧,日期等
filters = {
User.name == 'linyk3',
User.age > 25
}
User.query.filter(*filters).first()
經(jīng)過試驗(yàn)耀销,參數(shù)中 dict {} 和 list [] 都是可以的。
filters = [
User.name == 'linyk3',
User.age > 25 ]
User.query.filter(*filters).first()
如果查詢條件有多個铲汪,且不確定前端是否傳過來熊尉,或者傳過來的值是否為空罐柳,可以采用查詢條件拼接來實(shí)現(xiàn),這時list.append()方法就很有用處了,項(xiàng)目例子:
@admin.route("/query", methods=["GET"])
@admin.route("/query/<int:page>", methods=["GET"])
def clock_query(page=None):
if page is None:
page = 1
# app.logger.info(json.dumps(request.args))
# 拼接查詢條件
param = []
if ('userId' in request.args) and (request.args['userId']):
userId = request.args['userId']
param.append(LogInfo.userId == userId)
if ('userName' in request.args) and (request.args['userName']):
userName = request.args['userName']
param.append(LogInfo.userName == userName)
if ('startDate' in request.args) and (request.args['startDate']):
startDate = request.args['startDate']
param.append(db.cast(LogInfo.startTime, db.DATE) >= db.cast(startDate, db.Date))
if ('endDate' in request.args) and (request.args['endDate']):
endDate = request.args['endDate']
param.append(db.cast(LogInfo.startTime, db.DATE) <= db.cast(endDate, db.Date))
for item in param:
app.logger.info(item)
page_data = LogInfo.query.filter(*param).paginate(page=page, per_page=20)
return render_template("loginfo.html", page_data=page_data)
這樣后臺能接收的請求就很靈活了:
# 四個查詢條件都有
http://localhost:8080/admin/query?userId=linyk001&userName=linyk3&startDate=20180723&endDate=20180723
# 只有兩個查詢條件
http://localhost:8080/admin/query?userId=linyk001&userName=linyk3
# 有四個查詢條件狰住,但其中兩個為None硝清,所以不應(yīng)該作為查詢條件
http://localhost:8080/admin/query?userId=&userName=&startDate=20180723&endDate=20180723
這樣就非常靈活了,初學(xué)python转晰,搗鼓了挺久的才實(shí)現(xiàn)芦拿,發(fā)現(xiàn)python還是很方便的,繼續(xù)努力查邢!