1. 程式人生 > 其它 >Python流行ORM框架sqlalchemy

Python流行ORM框架sqlalchemy

安裝

http://docs.sqlalchemy.org

1、安裝


#進入虛擬環境
#執行
./python3 -m pip install

import sqlalchemy
print(sqlalchemy.__version__) # 1.1.15
我這裡使用的版本是1.1.15

建立連線物件

http://docs.sqlalchemy.org/en/latest/orm/tutorial.html#connecting


from sqlalchemy import create_engine
# 連線本地test資料庫
engine = create_engine("mysql://root:root@localhost/test?charset=utf8")
執行時會出錯,因為需要驅動庫,預設會呼叫MySQLdb。

ImportError: No module named 'MySQLdb'

我們前面安裝了pymysql,因此完整的要這麼寫:


engine = create_engine("mysql+pymysql://root:root@localhost/test?charset=utf8")

簡單使用

SQL語句查詢


result = engine.execute("select * from news")
print(result.fetchall())
#[(1, '本機新聞標題'), (2, '今天的新聞'), (3, '新聞標題1'), (4, '新聞標題2'), (5, '元組新聞1'), (6, '元組新聞2')]
建立對映

既然我們用ORM,就是為了少寫甚至不寫SQL語句。

ORM是資料表和物件之間的對映。

http://docs.sqlalchemy.org/en/latest/orm/tutorial.html#declare-a-mapping

1、建立一個Infos.py檔案,這個檔案我們來做資料表的對映


from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy import Column, Integer, String
class News(Base):
# 表名稱
__tablename__ = 'news'
# news表裡id欄位
id = Column(Integer, primary_key=True, autoincrement=True)
# news表裡title欄位
title = Column(String(length=255), nullable=False)
News類就是我們資料表news的對映(欄位:id、title)。

2、使用


from sqlalchemy import create_engine
from mappers.Infos import News
from sqlalchemy.orm import sessionmaker
# 連線本地test資料庫
engine = create_engine("mysql+pymysql://root:root@localhost/test?charset=utf8")
# 建立會話
session = sessionmaker(engine)
mySession = session()
# 查詢結果集
result = mySession.query(News).all()
print(result[0])
我們要注意最後的查詢結果,看看結果集中的元素長什麼樣?^_^

<mappers.Infos.News object at 0x1050c6e80>

查詢處理的記錄都是物件。

各種查詢

只查詢第一條記錄


# 查詢第一條
result = mySession.query(News).first()
print(result.title) #列印物件屬性
通過id欄位查詢


# 查詢id為2的
result = mySession.query(News).filter_by(id=2).first()
print(result.title)

# 查詢id為2的
result = mySession.query(News).filter(News.id==2).first()
分頁查詢


# 分頁查詢 0,2
result = mySession.query(News).filter(News.id>1).limit(2).offset(0).all()
print(result)
自定義過濾條件


# 自定義過濾條件
result = mySession.query(News).filter(text("id>:id")).params(id=2).all()
根據主鍵查詢


result = mySession.query(News).get(3)
print(result.title)
新增和修改


# 新增
news = News(title="新增測試標題")
mySession.add(news)
mySession.commit()

#修改
mySession.query(News).filter(News.id==7).update({"title":"修改之後的標題"})
mySession.commit()

Python利用sqlacodegen自動生成ORM實體類示例

前面方法我們是手動建立了一個名叫Infos.py的檔案,然後定義了一個News類,把這個類作為和我們news資料表的對映。


from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy import Column, Integer, String
class News(Base):
# 表名稱
__tablename__ = 'news'
# news表裡id欄位
id = Column(Integer, primary_key=True, autoincrement=True)
# news表裡title欄位
title = Column(String(length=255), nullable=False)
現在我們來看看sqlacodegen這個工具,自動生成像上面那樣的類檔案。

1、安裝sqlacodegen


#cd 專案虛擬環境
#執行
./python3 -m pip install sqlacodegen


2、使用sqlacodegen生成案列


#注意還是在虛擬環境目錄下執行
./sqlacodegen --tables fund --outfile ../../mappers/Found.py mysql+pymysql://root:root@localhost/test?charset=utf8