python之ORM操作
1. SQLalchemy簡介
SQLAlchemy是一個開源的SQL工具包,基本Python編程語言的MIT許可證而發布的對象關系映射器。SQLAlchemy提供了“一個熟知的企業級全套持久性模式, 專為高效率和高性能的數據庫訪問而設計“。SQLAlchemy的首次發布2006年2月,并已迅速成為最廣泛使用的對象關系映射在Python社區的工具之一。 使用ORM等獨立SQLAlchemy的一個優勢在于其允許開發人員首先考慮數據模型,并能決定稍后可視化數據的方式 ?2. SQLAlchempy的安裝 首先需安裝mysql 然后,下載SQLAlchemy-0.7.2,然后打開cmd,在安裝包文件目錄下, 運行python setup.py install,通過python下輸入import sqlalchemy,執行未報錯則表示安裝成功SQLAlchemy
SQLAlchemy是Python編程語言下的一款ORM框架,該框架建立在數據庫API之上,使用關系對象映射進行數據庫操作,簡言之便是:將對象轉換成SQL,然后使用數據API執行SQL并獲取執行結果。
ORM方法論基于三個核心原則:
簡單:以最基本的形式建模數據。
傳達性:數據庫結構被任何人都能理解的語言文檔化。
精確性:基于數據模型創建正確標準化了的結構。
Dialect用于和數據API進行交流,根據配置文件的不同調用不同的數據庫API,從而實現對數據庫的操作,如:
'數據庫類型+數據庫驅動名稱://用戶名:口令@機器地址:端口號/數據庫名'
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 請用pip或者源碼包安裝,確保環境可以正常使用。** 確保遠程數據庫服務器可以正常使用,并且擁有全新可以遠程登錄, 例如: 登錄數據庫:mysql -uroot -p 創建數據庫:create database s15; 授權庫:grant all on liuyao.* to john@"%" identified by '123456'; 更新:flush privileges; 3. SQLAlchemy的使用實例 一、完成簡單數據表信息查詢 # 1. 導入模塊 from sqlalchemy import * from sqlclchemy.orm import * # 2. 建立數據庫引擎鏈接數據庫:create_engine() engine = create_engine("mysql+mysqldb://john:123456@127.0.0.1:3306/s15", max_overflow=5)create_engine() 會返回一個數據庫引擎, mysql+mysqldb”指定了使用 MySQL-Python 來連接, 使用用戶名‘john’和密碼‘123456’來鏈接數據庫 127.0.0.1是數據庫鏈接地址可以是localhost,127.0.0.1 ‘s15’是數據庫名 max_overflow是最大連接數 其他方法: “charset”指定了連接時使用的字符集(可省略)=utf8 echo 參數為 True 時,會顯示每條執行的 SQL 語句,生產環境下可關閉。 mysql_engine = create_engine("$address", echo, module) #address 數據庫://用戶名:密碼(沒有密碼則為空)@主機名:端口/數據庫名 #echo標識用于設置通過python標準日志模塊完成的SQLAlchemy日志系統,當開啟日志功能,我們將能看到所有的SQL生成代碼
create_engine的第一個參數'sqlite:///:memory:'我們知道是建立數據庫連接的,那第二個參數echo=True是做什么的呢,其實如果echo=True那么SQLAlchemy將會通過Python標準模塊logging來輸出日志,
如果你在操作交互式命令控制臺,一些信息將會被輸出,這里我們可能會看到SQLAlchemy生成的一些SQL語句,這個對于我們學習和調試是很有必要的,所以在這里我們將其設置為True,否則,
如果不愿意SQLAlchemy這么啰嗦的話可以設置為False,這樣就看不到這些信息啦。
create_engine()將會返回一個Engine引擎實例(instance),其代表著SQLAlchemy對于數據庫的核心接口,其隱藏了各種數據庫方言(dialect)的細節,實際上SQLAlchemy的底層是Python的DBAPI。
需要注意的是此時并沒有實質上與數據庫建立連接,什么時候才會與數據庫真正建立連接呢?這個只會在你第一次查詢數據庫的時候發生。呃…這個有點像Lazy Loading (懶惰加載,延遲加載),也就是說我們需要真正操作數據庫的時候才真正建立連接。 段和數據類型及操作方法在sqlalchemy.schema包里有數據庫關系的描述,列舉幾個最常用的:
字段:Column
索引:Index
表:Table
數據類型在sqlalchemy.types包,列舉幾個最常用的:
二進制:BIGINT
布爾:BOOLEAN
字符:CHAR
可變字符:VARCHAR
日期:DATETIME
其他方法 execute,update,insert,select,delete,join等 自行補腦
# 3. 建立連接 connection = mysql_engine.connect() # 4. 查詢表信息 result = connection.execute("select name from t_name) for row in result: print "name: ", row['name'] # 5. 關閉連接 connection.close() ? 二、插入新的數據表 # 1. 導入模塊 from sqlalchemy import * from sqlclchemy.orm import * # 2. 建立數據庫引擎 mysql_engine = create_engine("$address", echo, module) #address 數據庫://用戶名:密碼(沒有密碼則為空)@主機名:端口/數據庫名 #echo標識用于設置通過python標準日志模塊完成的SQLAlchemy日志系統,當開啟日志功能,我們將能看到所有的SQL生成代碼 # 3. 設置metadata并將其綁定到數據庫引擎 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實現方式與SQL語言中的CRETE TABLE類似 # 5. 在數據庫中創建表 metadata.create_all(mysql_engine) #向數據庫發出CREATE TABLE命令,由此數據庫新建名為users的表 #調用時會檢查已經存在的表結構,因此可重復調用 # 6. 創建一個與數據庫中的users表匹配的python類 class user(): def __int__(self, name, fullname, password): self.name = name self.fullname = fullname self.passwd = passwd #python類的屬性需與users表的列名一致 # 7. 設置映射 from sqlalchemy.orm import mapper mapper(user, users) # mapper()創建一個新的Mapper對象,與定義的類相關聯 #需要注意的是,通過mapper建立映射的數據表必須帶有主鍵,如果沒有主鍵就無法定位某個table的某行row, #如果無法定位某行row, 就無法做Object-relational mapping這樣的映射 # 8. 創建session Session = sessionmaker(bind=mysql_egnine) session = Session() #由此我們只需對python的user類的操作,后臺數據庫的具體實現交由session完成 # 9. 執行 session.commit() #實現與數據庫的交互 # 10. 查詢 usr_info = session.query(user).filter_by(age=12).first() # 數據庫表是一個二維表, 包含多行多列. 把一個表的內容用pyton的數據接口表示的話, 可以用list表示多行 # list的每一個元素是tuple, 表示一個記錄.比如id 和name的user表 # [ # ('1', 'Michael'), # ('2', 'Bob'), # ('3', 'Adam') # ]# Python的DB-API返回的數據接口就是像上面這樣. # 但是用tuple表示一行很難看出表的結構.如果把一個tuple用class實例表示, 就可以更容易看出表的結構# class User(object): # def __init__(self, id, name): # self.id = id # self.name = name# 這就是傳說中的ORM技術: Object-Relational Mapping, 把關系數據庫的表結構映射到對象上. # 但是由誰來做這個轉換呢, 所以ORM框架應運而生. # 在Python中, 最有名的ORM框架是SQLAlchemy. 我們來看看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'# 表的結構id = Column(String(20), primary_key=True)name = Column(String(20))# 初始化數據庫連接 engine = create_engine('mysql+mysqlconnector://root:111111@localhost:3306/test') # 創建DBSession類型 DBSession = sessionmaker(bind=engine) # create_engine用來初始化數據庫連接. # SQLAlchemy用一個字符串表示連接信息'數據庫類型+數據庫驅動名稱://用戶名:口令@機器地址:端口號/數據庫名'# # 創建session對象: # session = DBSession() # # 創建新User對象 # new_user = User(id='5', name='Bob') # # 添加到session # session.add(new_user) # # 提交保存到數據庫 # session.commit() # # 關閉session # session.close()# 可見將關鍵是獲取session, 然后把對象添加到session, 最后提交并關閉.(DBSession對象, 可以看做是當前數據庫的連接)# 查詢 session = DBSession() # 創建Query查詢, filter是where條件, 最后調用one()返回唯一行, 如果調用all()則返回所有行. user = session.query(User).filter(User.id=='5').one() print('type:', type(user)) print('name:', user.name) session.close()# ORM就是把數據庫表的行與相應的對象簡歷關聯, 互相轉換. # 由于關系數據庫的多個表還可以用外鍵實現一對多, 多對多的關聯, 相應地, ORM框架也可以提供兩個對象之間的一對多, 多對多功能.
?
小結
ORM框架的作用就是把數據庫表的一行記錄與一個對象互相做自動轉換。
正確使用ORM的前提是了解關系數據庫的原理。
轉載于:https://www.cnblogs.com/zhangyux/p/6284669.html
總結
以上是生活随笔為你收集整理的python之ORM操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS 空中飘动的云动画
- 下一篇: webstorm快捷键说明