sqlalchemy的兩種方法詳解

2021-06-21 14:10:45 字數 4484 閱讀 2989

工作需要,用到了sqlalchemy, 經過近乙個月的不斷學習和探索實踐,現在整理一下,以免將來沒地方找。

下面的講解我們統一把資料庫的相關操作封裝在乙個類裡面。

先來說第一種:

from sqlalchemy import create_engine

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy.dialects.mysql import integer, datetime, real, text, varchar

from sqlalchemy import table, column, foreignkey, metadata

from sqlalchemy import func

import re

import hashlib

import os, sys

import time, datetime

class selectdata():

def __init__(self):

s1 = "mysql+mysqldb://"

server = "root:123456@localhost:3306/test"

s2 = "?use_unicode=0&charset=utf8"

connectserver = s1 + server + s2

self.engine = create_engine(connectserver, encoding = 'utf-8', echo = false)

self.base = metadata()

self.user= table(

'user', self.base,

column('id', integer, primary_key = true),

column('name', text)

column('passwd', text)

)self.client = table(

'client', self.base,

column('id', integer, primary_key = true),

column('name', text),

column('id_user', integer),

column('reserved_int', integer),

column('reserved_varchar', varchar(200))

)self.base.create_all(self.engine)#create_all可以自動檢測表是否已經建立,非常方便

self.session = sessionmaker() #建立了乙個自定義了的 session類

self.session.configure(bind = self.engine) #將建立的資料庫連線關聯到這個session

下面的函式是單錶的查詢插入更新展示:

def insert_function(self):

session = self.session()

class user(object): pass

class client(object): pass

#select方式:

ret = session.query(user).filter(user.name == "admin").first()

if ret is none:

#新增新的字段

user = user()

user.name = "admin"

user.passwd = coun***5("123456")#此處coun***5()是自己寫的乙個計算md5值的函式

session.add(user)

session.flush()

#session.commit()

#獲取剛剛插入資料的自增主鍵id

id_usr = user.id

else:

id_usr = ret.id

ret2 = session.query(client).filter_by(id_user = id_usr).first()

if ret2 is none:

client = client()

client.name = "chocolate"

client.id_user = id_usr

client.session.add(client)

session.flush()

session.commit()

else:

#使用update:

session.query(client).filter_by(id_user = id_usr).update()

session.flush()

session.commit()

session.close()

下面是多表聯合查詢:

#多表聯合查詢

def testfun2(self, partname, pageindex):

session = self.session()

class user(object): pass

class client(object): pass

pageval = (pageindex - 1) * 10

#這裡面乙個是like的用法,乙個是只顯示某10條

ret = self.session.query(user)\

.join(client, client.id_user == user.id )\

.filter(user.name.like('%' + partname + '%'))\

.offset().limit(10).all()

if ret is none:

return none

else:

for k in ret:

print k.name, k.passwd

session.close()

下面是刪除表的內容的用法:

#刪除表的全部內容,不刪除表

def delete_func(self):

session = self.session()

class user(object): pass

class client(object): pass

session.query(client).delete()

session.query(user).delete()

session.commit()

session.close()

上面就是orm的方式了,這個方式要特別注意的地方就是,session的問題,因為session是有個有效期的,如果我們把session在init函式裡面做成全域性變數self.session,那麼就會出現資料庫實時更新插入的值這裡面查詢不到,所以,對於session的態度,我們是用到再新建,用完手動關閉。

然後下面我們來講一下第二種方式,core的方式:

上面建表的部分是一樣的,只不過要把建完表之後session那一塊替換為:

self.base.create_all(self.engine)

self.conn = self.engine.connect()

定義乙個關閉資料庫連線的函式:

def close(self):

self.conn.close()

下面是簡單的一些基本用法:

包含了查詢,插入和更新。

def resetpwd(self, passwdm):

sel = select([self.user]).where(self.user.c.name == "admin")

ret = self.conn.execute(sel).fetchone()

if ret is none:

ins = self.user.insert().values(name = "admin", passwd = passwdm)

self.conn.execute(ins)

else:

updpwd = self.user.update().values(name = "admin", passwd = passwdm).where(self.user.c.name == "admin")

self.conn.execute(updpwd)

execute會自動commit,不用我們去手動做。這種core的方式要注意的地方就是表後面有個.c,如self.user.c.name,我也不知道為什麼有這個c,看官網的用例上都是這樣的,如果不加的話就不正確。所以還是屈從權威吧。問題解決了才最重要。

就是以上這些了。希望大家一起進步!

LCA兩種方法

lca least common ancestors 即最近公共祖先,是指在有根樹中,找出某兩個結點u和v最近的公共祖先。模板題 anc i j 表示第i個點的2 j的祖先的標號 整個過程就是兩個點往上跳到同一深度,再一起往上跳找到lca include include using namespac...

post get 兩種方法

a.定義乙個get函式 get url,headers none defget url,headers none return urlrequests url,headers headers 內部可以呼叫urlrequests 如果不寫headers headers會被預設為none b.定義乙個p...

popup的兩種方法

1,popup var pop function window.onload function aaa function closediv 2,div var divtop,divleft,divwidth,divheight,docheight,docwidth,objtimer,i 0 var ...