一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

python SQLAchemy

 復(fù)雜網(wǎng)絡(luò)621 2018-08-06

ORM、SQLAchemy

orm英文全稱object relational mapping,就是對象映射關(guān)系程序,簡單來說就是類似python這種面向?qū)ο蟮某绦騺碚f一切皆對象,但是使用的數(shù)據(jù)庫卻都是關(guān)系型的,為了保證一致的使用習(xí)慣,通過orm將編程語言的對象模型和數(shù)據(jù)庫的關(guān)系模型建立映射關(guān)系,這樣在使用編程語言對數(shù)據(jù)庫進(jìn)行操作的時候可以直接使用編程語言的對象模型進(jìn)行操作就可以了,而不用直接使用sql語言。

SQLAlchemy是Python編程語言下的一款ORM框架,該框架建立在數(shù)據(jù)庫API之上,使用關(guān)系對象映射進(jìn)行數(shù)據(jù)庫操作,簡言之便是:將對象轉(zhuǎn)換成SQL,然后使用數(shù)據(jù)API執(zhí)行SQL并獲取執(zhí)行結(jié)果。SQLAlchemy本身無法操作數(shù)據(jù)庫,其必須以來pymsql等第三方插件,Dialect用于和數(shù)據(jù)API進(jìn)行交流,根據(jù)配置文件的不同調(diào)用不同的數(shù)據(jù)庫API,從而實現(xiàn)對數(shù)據(jù)庫的操作:

1
2
3
4
5
6
7
8
9
10
11
MySQL-Python
    mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
     
pymysql
    mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
     
MySQL-Connector
    mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
     
cx_Oracle
    oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]

更多數(shù)據(jù)庫ORM鏈接方式資料:查看

 

1、安裝

1
pip3 install SQLAlchemy

 

2、創(chuàng)建sql表

2.1、原本創(chuàng)建sql表命令

1
2
3
4
5
6
CREATE TABLE user (
    id INTEGER NOT NULL AUTO_INCREMENT,
    name VARCHAR(32),
    password VARCHAR(64),
    PRIMARY KEY (id)
)

2.2、使用sqlalchemy創(chuàng)建表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
connect = create_engine("mysql+pymysql://root:123456@localhost:3306/mysql",
                        encoding="utf-8",
                        echo=True# 連接數(shù)據(jù)庫,echo=True =>把所有的信息都打印出來
Base = declarative_base()  # 生成ORM基類
class User(Base):
    __tablename__ = "hello_word"  # 表名
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))
Base.metadata.create_all(connect)   # 創(chuàng)建表結(jié)構(gòu)

2.3、sqlaicheym原始創(chuàng)建表的方式(2.2創(chuàng)建表的方式就是基于2.3的再封裝,所以2.3基本這種方式基本不使用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from sqlalchemy import Table, MetaData, Column, Integer, String, ForeignKey
from sqlalchemy.orm import mapper
  
metadata = MetaData()
  
# 表結(jié)構(gòu)
user = Table('user', metadata,
            Column('id', Integer, primary_key=True),
            Column('name', String(50)),
            Column('fullname', String(50)),
            Column('password', String(12))
        )
  
class User(object):
# User類的靜態(tài)變量
    def __init__(self, name, fullname, password):
        self.name = name
        self.fullname = fullname
        self.password = password
  
mapper(User, user) # mapper 函數(shù)使表結(jié)構(gòu)和User類的靜態(tài)變量關(guān)聯(lián)起來

 

 

最基本的表建立好了之后,再建立與數(shù)據(jù)的Session會話連接,就可以進(jìn)行增刪查改等操作:

1
2
session_class = sessionmaker(bind=connect)  # 創(chuàng)建與數(shù)據(jù)庫的會話session class ,這里返回給session的是個class,不是實例
session = session_class()   # 生成session實例

3、增

1
2
3
4
5
6
7
8
9
10
11
12
#新增一條數(shù)據(jù)
#原生sql:insert  into mysql.hello_word(name,password) values("test2","1234");
obj = User(name="test", password="1234"#生成你要創(chuàng)建的數(shù)據(jù)對象
session.add(obj) #把要創(chuàng)建的數(shù)據(jù)對象添加到這個session里, 一會統(tǒng)一創(chuàng)建
session.commit() #統(tǒng)一提交,創(chuàng)建數(shù)據(jù),在此之前數(shù)據(jù)庫是不會有新增數(shù)據(jù)的
#新增多條數(shù)據(jù)
#原生sql:insert  into mysql.hello_word(name,password) values("test2","1234"),("test3","123");
obj = User(name="test", password="1234")
obj1 = User(name="test", password="1234")
session.add_all([obj,obj1])
session.commit()<br><br>#回滾,在session.add()之后,在session.commit()之前,想把添加至session緩存中的數(shù)據(jù)清除,使用rollback()函數(shù)回滾即可<br>Session.rollback()
1

4、刪

1
2
3
#原生sql:mysql.hello_word where id > 5;
session.query(User).filter(User.id > 5).delete() #通過session查詢User類,然后過濾出id>5的進(jìn)行刪除
session.commit() #提交

5、改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#①第一種方式
data = Session.query(User).filter_by(name="test1").first()  #獲取數(shù)據(jù)
data.name = "test"  #修改數(shù)據(jù)
Session.commit()   #提交
#②第二種方式,通過查找表,過濾條件,然后更新對應(yīng)參數(shù)
session.query(User).filter(User.id > 15).update({"name": "test"})
session.query(User).filter(User.id == 18).update({User.name: "hello"}, synchronize_session=False)
session.query(User).filter_by(name="test1").update({User.password: User.name}, synchronize_session="evaluate")
session.commit()
#③synchronize_session解釋,用于query在進(jìn)行delete or update操作時,對session的同步策略:
#1、synchronize_session=False,不對session進(jìn)行同步,直接進(jìn)行delete or update操作。
#2、synchronize_session="evaluate",在delete or update操作之前,用query中的條件直接對session的identity_map中的objects進(jìn)行eval操作,將符合條件的記錄下來, 在delete or update操作之后,將符合條件的記錄刪除或更新。

6、查

6.1、幾種查詢方式的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#原生sql:select * from mysql.hello_word;
ret = session.query(User).all()  #查詢所有
#也可以這樣寫:
ret = Session.query(User.name,User.id).all()
#原生slq:select name,password from mysql.hello_word;
ret = session.query(User.name, User.extra).all()  #只查詢name和extra字段所以所有數(shù)據(jù)
#原生sql:select * from mysql.hello_word where name="test1";
ret = session.query(User).filter_by(name='test1').all() #查詢name='alex'的所有數(shù)據(jù)
ret = session.query(User).filter_by(name='test1').first()#查詢name='alex'的第一條數(shù)據(jù)
#查詢id>5的name字段內(nèi)容,且以id大小排序
#原生sql;select name from mysql.hello_word where id >5 order by id;
ret = session.query(User).filter(text("id>:value and name=:name")).params(value=5, name='test2').order_by(User.id).all()
#根據(jù)原生sql查詢數(shù)據(jù)
ret = session.query(User).from_statement(text("SELECT * FROM hello_word where name=:name")).params(name='test1').all()

6.2、filter和filter_by使用的區(qū)別

1
2
3
4
#filter用于sql表達(dá)式查詢過濾,如>,<, ==,等表達(dá)式
session.query(MyClass).filter(MyClass.name == 'some name')
#filter_by用于關(guān)鍵字查詢過濾,如id=value,name=value
session.query(MyClass).filter_by(name = 'some name')

6.3、重構(gòu)__repr__方法,將5.1 中ret內(nèi)存對象按__repr__方法中定義的格式進(jìn)行打印顯示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class User(Base):
    __tablename__ = "hello_word"  # 表名
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))
    def __repr__(self):    # 使返回的內(nèi)存對象變的可讀
        return "<id:{0} name:{1} password:{2}>".format(self.id, self.name, self.password)
#Base.metadata.create_all(connect)  # 創(chuàng)建標(biāo)結(jié)構(gòu)
session_class = sessionmaker(bind=connect)  # 創(chuàng)建與數(shù)據(jù)庫的會話session class ,這里返回給session的是個class,不是實例
session = session_class()   # 生成session實例
user = session.query(User).all()  #查詢?nèi)?/code>
print(user)
#輸出
[<id:1 name:test1 password:1234>, <id:2 name:test1 password:1234>, <id:8 name:test2 password:1234>, <id:9 name:test3 password:123>, <id:10 name:test4 password:123>, <id:11 name:test5 password:123>, <id:12 name:test2 password:1234>, <id:13 name:test3 password:123>, <id:14 name:test4 password:123>, <id:15 name:test5 password:123>, <id:16 name:test2 password:1234>, <id:17 name:test3 password:123>, <id:18 name:test4 password:123>, <id:19 name:test5 password:123>]

7、其他操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#多條件查詢
#原生sql:select * from mysql.hello_word where id >2 and id < 19
data = session.query(User).filter(Use.id>2).filter(Use.id<19).all()
<br>#通配符
#原生sql:select * from mysql.hello_word where name like "test%" #"test_"、%test%
data = session.query(User).filter(User.name.like('test%')).all() #匹配以test開頭,而后跟多個字符
data = session.query(User).filter(User.name.like('test_')).all() #匹配以test開頭,而后跟一個字符
data = session.query(User).filter(~User.name.like('e%')).all() #加~后,忽略like(),直接匹配所有
#原生sql select count(name) from mysql.hello_word where name like "%test%"
data = session.query(User).filter(User.name.like("%qigao%")).count() # 模糊匹配并計數(shù)
<br>
#分組
from sqlalchemy import func #導(dǎo)入func 進(jìn)行函數(shù)操作
#原生sql:select count(name),name from mysql.hello_word group by name
data =session.query(func.count(User.name),User.name).group_by(User.name).all()  #根據(jù)User.name分組
#原生sql:select max(id),sum(id),min(id) from mysql.hello_word group by name  #根據(jù)name 分組
data =session.query(func.max(User.id),func.sum(User.id),func.min(User.id)).group_by(User.name).all()
#原生sql:select max(id),sum(id),min(id) from mysql.hello_word group by name having min(id > 2) # 根據(jù)name分組且id>2
data = session.query(func.max(User.id),func.sum(User.id),func.min(User.id)).group_by(User.name).having(func.min(User.id) >2).all()
<br><br>#排序
#原生sql:select * from mysql.hello_word  order by id asc
data = session.query(User).order_by(User.id.asc()).all() #將所有數(shù)據(jù)根據(jù) “列” 從小到大排列
#原生sql:select * from mysql.hello_word  order by id desc, id asc
data = session.query(User).order_by(User.id.desc(), User.id.asc()).all()#將所有數(shù)據(jù)根據(jù) “列1” 從大到小排列,如果相同則按照“列2”由小到大排列
#條件表達(dá)式 in、between、 and 、or
data = session.query(User).filter_by(name='test').all()
data = session.query(User).filter(User.id > 1, Users.name == 'test').all()
data = session.query(User).filter(User.id.between(1, 3), Users.name == 'test').all()
data = session.query(User).filter(User.id.in_([1,3,4])).all()
data = session.query(User).filter(~User.id.in_([1,3,4])).all()
data = session.query(User).filter(Users.id.in_(session.query(User.id).filter_by(name='test'))).all()
from sqlalchemy import and_, or_
data = session.query(User).filter(and_(User.id > 3, Users.name == 'test')).all()
data = session.query(User).filter(or_(User.id < 2, Users.name == 'test')).all()
data = session.query(User).filter(or_(User.id < 2,and_(User.name == 'test',User.id > 3),User.password != "")).all()

  

  

 

  

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    国产精品不卡一区二区三区四区| 日韩高清中文字幕亚洲| 91午夜少妇极品福利| 九九热这里只有免费精品| 亚洲欧美国产中文色妇| 国产欧美性成人精品午夜| 日本午夜免费观看视频| 欧美日韩精品综合在线| 国产精品免费无遮挡不卡视频| 白白操白白在线免费观看| 亚洲精品成人午夜久久| 国产精品福利精品福利| 国产美女精品午夜福利视频| 亚洲国产性感美女视频| 亚洲男人天堂成人在线视频| 亚洲中文字幕视频在线播放 | 欧美一区二区三区视频区| 日韩一本不卡在线观看| 国产免费黄片一区二区| 久热人妻中文字幕一区二区| 老司机精品福利视频在线播放 | 国产欧美日本在线播放| 在线观看欧美视频一区| 亚洲另类女同一二三区| 日本午夜乱色视频在线观看| 亚洲国产精品肉丝袜久久| 国产精品一区二区成人在线| 熟妇人妻av中文字幕老熟妇| 视频在线免费观看你懂的| 欧美午夜不卡在线观看| 免费人妻精品一区二区三区久久久| 日本加勒比在线播放一区| 国产午夜精品在线免费看| 真实偷拍一区二区免费视频| 91天堂免费在线观看| 九九热精品视频免费在线播放| 邻居人妻人公侵犯人妻视频| 亚洲高清欧美中文字幕| 欧美国产日韩变态另类在线看| 日韩人妻毛片中文字幕| 国产麻豆成人精品区在线观看|