python之sqlalchemy模塊

来源:http://www.cnblogs.com/aylin/archive/2016/08/15/5770888.html
-Advertisement-
Play Games

sqlalchemy簡介 SQLAlchemy是Python編程語言下的一款開源軟體。提供了SQL工具包及對象關係映射(ORM)工具,使用MIT許可證發行。 SQLAlchemy“採用簡單的Python語言,為高效和高性能的資料庫訪問設計,實現了完整的企業級持久模型”。SQLAlchemy的理念是, ...


sqlalchemy簡介

SQLAlchemy是Python編程語言下的一款開源軟體。提供了SQL工具包及對象關係映射(ORM)工具,使用MIT許可證發行。

SQLAlchemy“採用簡單的Python語言,為高效和高性能的資料庫訪問設計,實現了完整的企業級持久模型”。SQLAlchemy的理念是,SQL資料庫的量級和性能重要於對象集合;而對象集合的抽象又重要於表和行。因此,SQLAlchmey採用了類似於JavaHibernate的數據映射模型,而不是其他ORM框架採用的Active Record模型。不過,Elixir和declarative等可選插件可以讓用戶使用聲明語法。

SQLAlchemy與資料庫關係圖如下:

sqlalchemy基本操作

 一、安裝sqlalchemy

  • 本文采用的是mysql案例,所以需要一臺有安裝mysql資料庫的機器
  • 使用python的pip3安裝 pip3 install sqlalchemy

安裝完後查看版本信息

import sqlalchemy
sqlalchemy.__version__

二、連接資料庫

在sqlalchemy中,session用於創建程式與資料庫之間的會話。所有對象的載入和保存都需要通過session對象。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# 鏈接資料庫採用pymysq模塊做映射,後面參數是最大連接數5
ENGINE=create_engine("mysql+pymysql://[email protected]:3306/digchouti?charset=utf8", max_overflow=5)
Session = sessionmaker(bind=engine)

session = Session()

三、創建映射(創建表)

一個映射對應著一個Python類,用來表示一個表的結構。下麵創建一個person表,包括id和name兩個欄位。也就是說創建表就是用python的的類來實現

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

ENGINE=create_engine("mysql+pymysql://[email protected]:3306/digchouti?charset=utf8", max_overflow=5)

#生成一個SQLORM基類,創建表必須繼承他,別問我啥意思就是這麼規定的
Base = declarative_base()

class Person(Base):
    __tablename__ = 'userinfo'

    id   = Column(Integer, primary_key=True)
    name = Column(String(32))

    def __repr__(self):
        return "<Person(name='%s')>" % self.name

此代碼是創建了一個名字叫userinfo的表,表裡有兩列,一列是id,一列是name。

四、添加數據

當然我們創建了表,肯定也要添加數據,代碼如下:

#創建一個person對象
person = Person(name='張岩林')
#添加person對象,但是仍然沒有提交到資料庫
session.add(person)
#提交資料庫
session.commit()

當然還能添加多條數據:

session.add_all([
    Person(name='張岩林'),
    Person(name='aylin')
])
session.commit()

五、查找數據

在sqlalchemy模塊中,查找數據給提供了query()的方法 下麵我就把能用到的給列舉一下:

#獲取所有數據
session.query(Person).all()

#獲取name=‘張岩林’的那行數據
session.query(Person).filter(Person.name=='張岩林').one()

#獲取返回數據的第一行
session.query(Person).first()

#查找id大於1的所有數據
session.query(Person.name).filter(Person.id>1).all()

#limit索引取出第一二行數據
session.query(Person).all()[1:3]

#order by,按照id從大到小排列
session.query(Person).ordre_by(Person.id)

#equal/like/in
query = session.query(Person)
query.filter(Person.id==1).all()
query.filter(Person.id!=1).all()
query.filter(Person.name.like('%ay%')).all()
query.filter(Person.id.in_([1,2,3])).all()
query.filter(~Person.id.in_([1,2,3])).all()
query.filter(Person.name==None).all()

#and or
from sqlalchemy import and_
from sqlalchemy import or_
query.filter(and_(Person.id==1, Person.name=='張岩林')).all()
query.filter(Person.id==1, Person.name=='張岩林').all()
query.filter(Person.id==1).filter(Person.name=='張岩林').all()
query.filter(or_(Person.id==1, Person.id==2)).all()

# count計算個數
session.query(Person).count()

# 修改update
session.query(Person).filter(id > 2).update({'name' : '張岩林'})

查詢這塊比較多,可能寫的不全還望各位見諒,剩下我相信大家都能擴展起來

上面的介紹完了,可能各位還不能吧融合到一塊去,下麵我給大家融合寫在一塊吧:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column
from sqlalchemy import Integer, String, TIMESTAMP
from sqlalchemy import ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine

ENGINE=create_engine("mysql+pymysql://[email protected]:3306/digchouti?charset=utf8", max_overflow=5)

Base = declarative_base()

class Person(Base):
    __tablename__ = 'userinfo'

    id   = Column(Integer, primary_key=True)
    name = Column(String(32))

    def __repr__(self):
        return "<Person(name='%s')>" % self.name

#創建連接資料庫以供提交用,至此表會創建完成,可以去資料庫裡面查看
Base.metadata.create_all(ENGINE)
Session = sessionmaker(bind=engine)
# 往裡面插入多條數據
session = Session()
session.add_all([
    Person(name='張岩林'),
    Person(name='很帥')
])
session.commit()

sqlalchemy表關係之高級用法

上面闡述的是對於一張表的操作,下麵將說的是表關係的一對多,多對多,瞭解資料庫的都知道外鍵,也就是表關係建立。

1、一對多外鍵(1)

第一種方法我們只用到普通的操作,這個方式相對於好理解,在第一張表創建完,插入數據然後要記得提交數據,然後往第二章表創建數據的時候,可以直接拿第一張相關聯的數據,代碼如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import  Column,Integer,ForeignKey,UniqueConstraint,Index,String
from sqlalchemy.orm import sessionmaker,relationship
from sqlalchemy import create_engine


engine=create_engine('mysql+pymysql://[email protected]:3306/db1')

Base = declarative_base()

class Son(Base):
    __tablename__ = 'son'
    id = Column(Integer,primary_key=True)
    name = Column(String(32))
    age = Column(String(32))
    # 創建外鍵,對應父親那張表的id項
    father_id = Column(Integer,ForeignKey('father.id'))

class Father(Base):
    __tablename__ = 'father'
    id = Column(Integer,primary_key=True)
    name = Column(String(32))
    age = Column(String(32))

Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

f1 = Father(name = 'zhangyanlin',age = '18')
session.add(f1)
session.commit()

w1 = Son(name = 'xiaozhang1',age = 3,father_id = 1)
w2 = Son(name = 'xiaozhang2',age = 3,father_id = 1)

session.add_all([w1,w2])
session.commit()

2、一對多外鍵(2)relationship

 第二種方法和第一種一樣,只是這裡改用了relationship來做外鍵關係,代碼如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import  Column,Integer,ForeignKey,UniqueConstraint,Index,String
from sqlalchemy.orm import sessionmaker,relationship
from sqlalchemy import create_engine


engine = create_engine('mysql+pymysql://[email protected]:3306/db1')

Base = declarative_base()

class Son(Base):
    __tablename__ = 'son'
    id = Column(Integer,primary_key=True)
    name = Column(String(32))
    age = Column(String(32))

    father_id = Column(Integer,ForeignKey('father.id'))

class Father(Base):
    __tablename__ = 'father'
    id = Column(Integer,primary_key=True)
    name = Column(String(32))
    age = Column(String(32))
    son = relationship('Son')

Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

f1 = Father(name = 'zhangyanlin',age = '18')

w1 = Son(name = 'xiaozhang1',age = '3')
w2 = Son(name = 'xiaozhang2',age = '4')
# 重點是這裡綁定關係
f1.son = [w1,w2]
# 只需要把父親給傳進去,兒子的自然就上傳進去啦
session.add(f1)
session.commit()

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文鏈接: 一些廢話 一門語言火不火,與語言本身並沒太大關係,主要看語言的推廣。 推廣得好,用的人多,問題也能及時得到解決,用的人就越多,這是一個良性迴圈,即使語言本身有很多不足也很快能得到解決。 但有的語言本身很好,使用者卻不多,缺少交流和推廣,致使進入惡性迴圈。 "《黑客與畫家》" 作者把Lis ...
  • Lambda表達式也是C#3.0中最重要的特性之一。 1、Lambda表達式的簡介 Lambda表達式可以理解為一個匿名方法,它可以包含表達式和語句,並且用於創建委托或轉換為表達式樹。在使用Lambda表達式時,都會使用“=>”運算符,該運算符的左邊是匿名方法的輸入參數,右邊則是表達式或語句塊。 1 ...
  • java語言規範,jls,java language specifications ...
  • 1、Python環境配置: Python官網:https://www.python.org/ Pycharm官網 http://www.jetbrains.com/pycharm/download 下載好之後安裝,註意勾選環境變數。 2、寫python一定要註意代碼的縮進。 2、字元串: (1)、字 ...
  • Cron表達式是一個字元串,字元串以5或6個空格隔開,分為6或7個域,每一個域代表一個含義,Cron有如下兩種語法格式: Seconds Minutes Hours DayofMonth Month DayofWeek Year或 Seconds Minutes Hours DayofMonth M ...
  • 1、python 簡介 各種網站都有關於 Python 的簡介 Python is powerful... and fast; plays well with others; runs everywhere; is friendly & easy to learn; is Open. 2、pytho ...
  • JavaScript的語法規則 l JavaScript區分大小寫 比如變數a和變數A是不一樣的變數,要嚴格區分大小寫 l JavaScript腳本程式須嵌入在HTML文件中 因為javascript腳本程式是通過script標簽引入,script標簽,是要寫在HTML文檔中的,不能單獨寫。 l J ...
  • php和html混編的三種方式 以下內容轉自:http://blog.i1728.com/post/110.html 原文標題是:《PHP的(<<》,新標題是我加的,文章里的紅字也是我標註的; 07月22日 分類: 學習筆記 8條評論 16532 ℃ 在W3school 上學PHP,看到第一句就是“ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...