Python SQLAlchemy 不確定條件查詢

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ù)努力查邢!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔗崎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扰藕,更是在濱河造成了極大的恐慌缓苛,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邓深,死亡現(xiàn)場離奇詭異未桥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)芥备,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門冬耿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萌壳,你說我怎么就攤上這事亦镶。” “怎么了袱瓮?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵缤骨,是天一觀的道長。 經(jīng)常有香客問我尺借,道長绊起,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任燎斩,我火速辦了婚禮虱歪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瘫里。我一直安慰自己实蔽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布谨读。 她就那樣靜靜地躺著局装,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铐尚,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天拨脉,我揣著相機(jī)與錄音,去河邊找鬼宣增。 笑死玫膀,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的爹脾。 我是一名探鬼主播帖旨,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼灵妨!你這毒婦竟也來了解阅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤泌霍,失蹤者是張志新(化名)和其女友劉穎货抄,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朱转,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蟹地,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了藤为。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怪与。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凉蜂,靈堂內(nèi)的尸體忽然破棺而出琼梆,到底是詐尸還是另有隱情,我是刑警寧澤窿吩,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站错览,受9級特大地震影響纫雁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜倾哺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一轧邪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧羞海,春花似錦忌愚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春简十,著一層夾襖步出監(jiān)牢的瞬間檬某,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工螟蝙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恢恼,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓胰默,卻偏偏與公主長得像场斑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子牵署,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354