日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python之ORM操作

發(fā)布時(shí)間:2024/8/26 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python之ORM操作 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. SQLalchemy簡(jiǎn)介

SQLAlchemy是一個(gè)開源的SQL工具包,基本Python編程語(yǔ)言的MIT許可證而發(fā)布的對(duì)象關(guān)系映射器。SQLAlchemy提供了“一個(gè)熟知的企業(yè)級(jí)全套持久性模式, 專為高效率和高性能的數(shù)據(jù)庫(kù)訪問(wèn)而設(shè)計(jì)“。SQLAlchemy的首次發(fā)布2006年2月,并已迅速成為最廣泛使用的對(duì)象關(guān)系映射在Python社區(qū)的工具之一。 使用ORM等獨(dú)立SQLAlchemy的一個(gè)優(yōu)勢(shì)在于其允許開發(fā)人員首先考慮數(shù)據(jù)模型,并能決定稍后可視化數(shù)據(jù)的方式 ?2. SQLAlchempy的安裝 首先需安裝mysql 然后,下載SQLAlchemy-0.7.2,然后打開cmd,在安裝包文件目錄下, 運(yùn)行python setup.py install,通過(guò)python下輸入import sqlalchemy,執(zhí)行未報(bào)錯(cuò)則表示安裝成功

SQLAlchemy

SQLAlchemy是Python編程語(yǔ)言下的一款ORM框架,該框架建立在數(shù)據(jù)庫(kù)API之上,使用關(guān)系對(duì)象映射進(jìn)行數(shù)據(jù)庫(kù)操作,簡(jiǎn)言之便是:將對(duì)象轉(zhuǎn)換成SQL,然后使用數(shù)據(jù)API執(zhí)行SQL并獲取執(zhí)行結(jié)果。

ORM方法論基于三個(gè)核心原則:

簡(jiǎn)單:以最基本的形式建模數(shù)據(jù)。

傳達(dá)性:數(shù)據(jù)庫(kù)結(jié)構(gòu)被任何人都能理解的語(yǔ)言文檔化。

精確性:基于數(shù)據(jù)模型創(chuàng)建正確標(biāo)準(zhǔn)化了的結(jié)構(gòu)。

Dialect用于和數(shù)據(jù)API進(jìn)行交流,根據(jù)配置文件的不同調(diào)用不同的數(shù)據(jù)庫(kù)API,從而實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作,如:

'數(shù)據(jù)庫(kù)類型+數(shù)據(jù)庫(kù)驅(qū)動(dòng)名稱://用戶名:口令@機(jī)器地址:端口號(hào)/數(shù)據(jù)庫(kù)名'

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...]

更多詳見:http://docs.sqlalchemy.org/en/latest/dialects/index.html

注:

2.7版本使用mysqldb 3.5版本使用pymysql 請(qǐng)用pip或者源碼包安裝,確保環(huán)境可以正常使用。** 確保遠(yuǎn)程數(shù)據(jù)庫(kù)服務(wù)器可以正常使用,并且擁有全新可以遠(yuǎn)程登錄, 例如: 登錄數(shù)據(jù)庫(kù):mysql -uroot -p 創(chuàng)建數(shù)據(jù)庫(kù):create database s15; 授權(quán)庫(kù):grant all on liuyao.* to john@"%" identified by '123456'; 更新:flush privileges; 3. SQLAlchemy的使用實(shí)例 一、完成簡(jiǎn)單數(shù)據(jù)表信息查詢 # 1. 導(dǎo)入模塊 from sqlalchemy import * from sqlclchemy.orm import * # 2. 建立數(shù)據(jù)庫(kù)引擎
鏈接數(shù)據(jù)庫(kù):create_engine() engine = create_engine("mysql+mysqldb://john:123456@127.0.0.1:3306/s15", max_overflow=5)create_engine() 會(huì)返回一個(gè)數(shù)據(jù)庫(kù)引擎, mysql+mysqldb”指定了使用 MySQL-Python 來(lái)連接, 使用用戶名‘john’和密碼‘123456’來(lái)鏈接數(shù)據(jù)庫(kù) 127.0.0.1是數(shù)據(jù)庫(kù)鏈接地址可以是localhost,127.0.0.1 ‘s15’是數(shù)據(jù)庫(kù)名 max_overflow是最大連接數(shù) 其他方法: “charset”指定了連接時(shí)使用的字符集(可省略)=utf8 echo 參數(shù)為 True 時(shí),會(huì)顯示每條執(zhí)行的 SQL 語(yǔ)句,生產(chǎn)環(huán)境下可關(guān)閉。 mysql_engine = create_engine("$address", echo, module) #address 數(shù)據(jù)庫(kù)://用戶名:密碼(沒有密碼則為空)@主機(jī)名:端口/數(shù)據(jù)庫(kù)名 #echo標(biāo)識(shí)用于設(shè)置通過(guò)python標(biāo)準(zhǔn)日志模塊完成的SQLAlchemy日志系統(tǒng),當(dāng)開啟日志功能,我們將能看到所有的SQL生成代碼
create_engine的第一個(gè)參數(shù)'sqlite:///:memory:'我們知道是建立數(shù)據(jù)庫(kù)連接的,那第二個(gè)參數(shù)echo=True是做什么的呢,其實(shí)如果echo=True那么SQLAlchemy將會(huì)通過(guò)Python標(biāo)準(zhǔn)模塊logging來(lái)輸出日志,
如果你在操作交互式命令控制臺(tái),一些信息將會(huì)被輸出,這里我們可能會(huì)看到SQLAlchemy生成的一些SQL語(yǔ)句,這個(gè)對(duì)于我們學(xué)習(xí)和調(diào)試是很有必要的,所以在這里我們將其設(shè)置為True,否則,
如果不愿意SQLAlchemy這么啰嗦的話可以設(shè)置為False,這樣就看不到這些信息啦。

create_engine()將會(huì)返回一個(gè)Engine引擎實(shí)例(instance),其代表著SQLAlchemy對(duì)于數(shù)據(jù)庫(kù)的核心接口,其隱藏了各種數(shù)據(jù)庫(kù)方言(dialect)的細(xì)節(jié),實(shí)際上SQLAlchemy的底層是Python的DBAPI。

需要注意的是此時(shí)并沒有實(shí)質(zhì)上與數(shù)據(jù)庫(kù)建立連接,什么時(shí)候才會(huì)與數(shù)據(jù)庫(kù)真正建立連接呢?這個(gè)只會(huì)在你第一次查詢數(shù)據(jù)庫(kù)的時(shí)候發(fā)生。呃…這個(gè)有點(diǎn)像Lazy Loading (懶惰加載,延遲加載),也就是說(shuō)我們需要真正操作數(shù)據(jù)庫(kù)的時(shí)候才真正建立連接。 段和數(shù)據(jù)類型及操作方法

在sqlalchemy.schema包里有數(shù)據(jù)庫(kù)關(guān)系的描述,列舉幾個(gè)最常用的:

字段:Column

索引:Index

表:Table

數(shù)據(jù)類型在sqlalchemy.types包,列舉幾個(gè)最常用的:

二進(jìn)制:BIGINT

布爾:BOOLEAN

字符:CHAR

可變字符:VARCHAR

日期:DATETIME

其他方法 execute,update,insert,select,delete,join等 自行補(bǔ)腦


# 3. 建立連接 connection = mysql_engine.connect() # 4. 查詢表信息 result = connection.execute("select name from t_name) for row in result: print "name: ", row['name'] # 5. 關(guān)閉連接 connection.close() ? 二、插入新的數(shù)據(jù)表 # 1. 導(dǎo)入模塊 from sqlalchemy import * from sqlclchemy.orm import * # 2. 建立數(shù)據(jù)庫(kù)引擎 mysql_engine = create_engine("$address", echo, module) #address 數(shù)據(jù)庫(kù)://用戶名:密碼(沒有密碼則為空)@主機(jī)名:端口/數(shù)據(jù)庫(kù)名 #echo標(biāo)識(shí)用于設(shè)置通過(guò)python標(biāo)準(zhǔn)日志模塊完成的SQLAlchemy日志系統(tǒng),當(dāng)開啟日志功能,我們將能看到所有的SQL生成代碼 # 3. 設(shè)置metadata并將其綁定到數(shù)據(jù)庫(kù)引擎 metadata = Metadata(mysql_engine) # 4. 定義需新建的表 users = Table('users', metadata,Column('user_id', Integer, primary_key=True), Column('name', String(40)), Column('age', Integer), Column('password', String),) #Table實(shí)現(xiàn)方式與SQL語(yǔ)言中的CRETE TABLE類似 # 5. 在數(shù)據(jù)庫(kù)中創(chuàng)建表 metadata.create_all(mysql_engine) #向數(shù)據(jù)庫(kù)發(fā)出CREATE TABLE命令,由此數(shù)據(jù)庫(kù)新建名為users的表 #調(diào)用時(shí)會(huì)檢查已經(jīng)存在的表結(jié)構(gòu),因此可重復(fù)調(diào)用 # 6. 創(chuàng)建一個(gè)與數(shù)據(jù)庫(kù)中的users表匹配的python類 class user(): def __int__(self, name, fullname, password): self.name = name self.fullname = fullname self.passwd = passwd #python類的屬性需與users表的列名一致 # 7. 設(shè)置映射 from sqlalchemy.orm import mapper mapper(user, users) # mapper()創(chuàng)建一個(gè)新的Mapper對(duì)象,與定義的類相關(guān)聯(lián) #需要注意的是,通過(guò)mapper建立映射的數(shù)據(jù)表必須帶有主鍵,如果沒有主鍵就無(wú)法定位某個(gè)table的某行row, #如果無(wú)法定位某行row, 就無(wú)法做Object-relational mapping這樣的映射 # 8. 創(chuàng)建session Session = sessionmaker(bind=mysql_egnine) session = Session() #由此我們只需對(duì)python的user類的操作,后臺(tái)數(shù)據(jù)庫(kù)的具體實(shí)現(xiàn)交由session完成 # 9. 執(zhí)行 session.commit() #實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的交互 # 10. 查詢 usr_info = session.query(user).filter_by(age=12).first() # 數(shù)據(jù)庫(kù)表是一個(gè)二維表, 包含多行多列. 把一個(gè)表的內(nèi)容用pyton的數(shù)據(jù)接口表示的話, 可以用list表示多行 # list的每一個(gè)元素是tuple, 表示一個(gè)記錄.比如id 和name的user表 # [ # ('1', 'Michael'), # ('2', 'Bob'), # ('3', 'Adam') # ]# Python的DB-API返回的數(shù)據(jù)接口就是像上面這樣. # 但是用tuple表示一行很難看出表的結(jié)構(gòu).如果把一個(gè)tuple用class實(shí)例表示, 就可以更容易看出表的結(jié)構(gòu)# class User(object): # def __init__(self, id, name): # self.id = id # self.name = name# 這就是傳說(shuō)中的ORM技術(shù): Object-Relational Mapping, 把關(guān)系數(shù)據(jù)庫(kù)的表結(jié)構(gòu)映射到對(duì)象上. # 但是由誰(shuí)來(lái)做這個(gè)轉(zhuǎn)換呢, 所以O(shè)RM框架應(yīng)運(yùn)而生. # 在Python中, 最有名的ORM框架是SQLAlchemy. 我們來(lái)看看SQLAlchemy的用法.from sqlalchemy import Column, String, create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_baseBase = declarative_base()class User(Base):# 表的名字__tablename__ = 'user'# 表的結(jié)構(gòu)id = Column(String(20), primary_key=True)name = Column(String(20))# 初始化數(shù)據(jù)庫(kù)連接 engine = create_engine('mysql+mysqlconnector://root:111111@localhost:3306/test') # 創(chuàng)建DBSession類型 DBSession = sessionmaker(bind=engine) # create_engine用來(lái)初始化數(shù)據(jù)庫(kù)連接. # SQLAlchemy用一個(gè)字符串表示連接信息'數(shù)據(jù)庫(kù)類型+數(shù)據(jù)庫(kù)驅(qū)動(dòng)名稱://用戶名:口令@機(jī)器地址:端口號(hào)/數(shù)據(jù)庫(kù)名'# # 創(chuàng)建session對(duì)象: # session = DBSession() # # 創(chuàng)建新User對(duì)象 # new_user = User(id='5', name='Bob') # # 添加到session # session.add(new_user) # # 提交保存到數(shù)據(jù)庫(kù) # session.commit() # # 關(guān)閉session # session.close()# 可見將關(guān)鍵是獲取session, 然后把對(duì)象添加到session, 最后提交并關(guān)閉.(DBSession對(duì)象, 可以看做是當(dāng)前數(shù)據(jù)庫(kù)的連接)# 查詢 session = DBSession() # 創(chuàng)建Query查詢, filter是where條件, 最后調(diào)用one()返回唯一行, 如果調(diào)用all()則返回所有行. user = session.query(User).filter(User.id=='5').one() print('type:', type(user)) print('name:', user.name) session.close()# ORM就是把數(shù)據(jù)庫(kù)表的行與相應(yīng)的對(duì)象簡(jiǎn)歷關(guān)聯(lián), 互相轉(zhuǎn)換. # 由于關(guān)系數(shù)據(jù)庫(kù)的多個(gè)表還可以用外鍵實(shí)現(xiàn)一對(duì)多, 多對(duì)多的關(guān)聯(lián), 相應(yīng)地, ORM框架也可以提供兩個(gè)對(duì)象之間的一對(duì)多, 多對(duì)多功能.

?

小結(jié)

ORM框架的作用就是把數(shù)據(jù)庫(kù)表的一行記錄與一個(gè)對(duì)象互相做自動(dòng)轉(zhuǎn)換。

正確使用ORM的前提是了解關(guān)系數(shù)據(jù)庫(kù)的原理。

轉(zhuǎn)載于:https://www.cnblogs.com/zhangyux/p/6284669.html

總結(jié)

以上是生活随笔為你收集整理的python之ORM操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。