91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Python 中使用SQLAlchemy操作數據庫

發布時間:2021-05-07 17:01:40 來源:億速云 閱讀:215 作者:Leah 欄目:開發技術

這篇文章給大家介紹怎么在Python 中使用SQLAlchemy操作數據庫,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

python的數據類型有哪些?

python的數據類型:1. 數字類型,包括int(整型)、long(長整型)和float(浮點型)。2.字符串,分別是str類型和unicode類型。3.布爾型,Python布爾類型也是用于邏輯運算,有兩個值:True(真)和False(假)。4.列表,列表是Python中使用最頻繁的數據類型,集合中可以放任何數據類型。5. 元組,元組用”()”標識,內部元素用逗號隔開。6. 字典,字典是一種鍵值對的集合。7. 集合,集合是一個無序的、不重復的數據組合。

SQLAlchemy 簡介

SQLAlchemy 是一個功能強大的開源 Python ORM 工具包。它提供了 “一個知名企業級的持久化模式的,專為高效率和高性能的數據庫訪問設計的,改編成一個簡單的 Python 域語言的完整套件”。它采用了數據映射模式(像 Java 中的 Hibernate)而不是 Active Record 模式(像Ruby on Rails 的 ORM)。

SQLAlchemy官網。

SQLAlchemy 的優缺點:

優點:

  • 企業級 API,使得代碼有健壯性和適應性。

  • 靈活的設計,使得能輕松完成復雜的數據查詢。

缺點:

  • 工作單元概念不常見。

  • 重量級 API,導致長學習曲線。

SQLAlchemy 應用

以下是一段使用 SQLAlchemy 操作 SQLite 數據庫的代碼

# -*- coding:utf-8 -*-

from sqlalchemy import (
  create_engine,
  Column,
  Integer,
  String,
)

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

engine = create_engine('sqlite:///./sqlalchemy.sqlite', echo=True)

Base = declarative_base()

class User(Base):
  __tablename__ = 'users'

  id = Column(Integer, primary_key=True, autoincrement=True)
  name = Column(String)
  fullname = Column(String)
  nickname = Column(String)

  def __repr__(self):
    return "<User(name='%s', fullname='%s', nickname='%s')>" % (self.name, self.fullname, self.nickname)


db_session = sessionmaker(bind=engine)
session = db_session()

Base.metadata.create_all(engine)

user1 = User(name='ed', fullname='Ed Jones', nickname='edsnickname')
user2 = User(name='wendy', fullname='Wendy Williams', nickname='windy')
user3 = User(name='mary', fullname='Mary Contrary', nickname='mary')

session.add(user1)
session.add(user2)
session.add(user3)
session.commit()

user = session.query(User).filter(User.id<2).all()
print(user)
user = session.query(User).filter(User.id<=5).all()
print(user)

user1.name = 'admin'
session.merge(user1)
user4 = User(name='fred', fullname='Fred Flintstone', nickname='freddy')
session.merge(user4)
session.query(User).filter(User.id==2).update({'name':'test'})
user = session.query(User).filter(User.id<=5).all()
print(user)

在以上代碼中我們完成了一下工作:

  1. 連接到數據庫「本次我們使用的是 SQLite 數據庫」。

  2. 創建數據庫表并將其映射到 Python 類上。

  3. 創建數據實例,并將其保存到數據庫中。

  4. 對保存在數據庫中的數據進行讀取和修改。

導入 SQLAlchemy 模塊并連接到 SQLite 數據庫

SQLAlchemy 通過 create_engine 函數來創建數據庫連接。create_engine 函數的第一個參數是數據了 URL,第二個參數 echo 設置為 True 表示在程序的運行過程中我們可以在控制臺看到操作所涉及到的 SQL 語句。

在本次示例中我們使用的數據庫是 SQLite,你也可以使用其他數據庫。只有在調試狀態下將 echo 設置為 True,在生產環境請將 echo 設置為 false 或省略 echo 參數。

engine = create_engine('sqlite:///./sqlalchemy.sqlite', echo=True)

create_engine 返回的是一個 Engine 實例,它指向數據庫的一些核心接口。SQLAlchemy會根據你選擇的數據庫配置而調用對應的 DB-API。

create_engine 函數并會不真正建立數據庫的 DB-API 連接,當調用 Engine.execute() 或 Engine.connect() 方法時才會建立連接。大多數情況下我們無需關注 Engine,SQLAlchemy 會幫我們處理。

創建數據庫表

將 python 類映射到數據庫表上,這個 Python 類需要時一個指定基類的子類,這個基類應當含有ORM映射中相關的類和表的信息。這個基類可以通過 declarative_base 方法來創建。
Base = declarative_base()

在這個示例中使用 Base 基類創建了一個 User 的類來作為數據庫表。

class User(Base):
  __tablename__ = 'users'

  id = Column(Integer, primary_key=True, autoincrement=True)
  name = Column(String)
  fullname = Column(String)
  nickname = Column(String)

  def __repr__(self):
    return "<User(name='%s', fullname='%s', nickname='%s')>" % (self.name, self.fullname, self.nickname)

在 User 類中我們定義了需要映射到數據庫表上的屬性,主要包括表名稱、列的類型和名稱等。這個類至少應包含一個名為 tablename 的屬性來給出數據庫表的名稱,及至少一個給出表的主鍵「primary key」的列。在 User 類中我們定義了表名稱為 users,定義了 id、name、fullname、nickname 四列數據,并設置 id 為表的主鍵。
創建完成 User 類后,實際在 SQLite 數據庫中并不存在該表,此時需要使用 declarative 基類的 Metadata.create_all 在數據庫中創建 users 表,在 create_all 方法中我們需要傳入參數 Engine。

通過 Metadata.create_all 傳入的 Engine 參數,SQLAlchemy 自動實現對數據庫的連接。

Base.metadata.create_all(engine)

metadata.create_all 方法執行完成后在 SQLite 數據庫即可查到名稱為 users 的數據表。

保存數據實例到數據庫中

將數據保存到數據庫中,我們需要 User 的實例和用于操作數據的 session。

session 是 ORM 數據的接口,可以通過 session 來操作數據庫中的數據。

使用已經定義完成的 User 類將數據實例化。

user1 = User(name='ed', fullname='Ed Jones', nickname='edsnickname')
user2 = User(name='wendy', fullname='Wendy Williams', nickname='windy')
user3 = User(name='mary', fullname='Mary Contrary', nickname='mary')

獲取 session 首先需要使用 sessionmaker 來得到 session 的工廠類,然后通過工廠類來獲取 session。

db_session = sessionmaker(bind=engine)
session = db_session()

session 通過 Engine 與數據庫進行關聯。session 創建完成后并不會立即打開與數據庫的連接,只有當我們第一使用 session 是,才會從 Engine 維護的連接池中取出一個連接來操作數據庫,這個連接在我們關閉 session 時會被釋放。
獲取 session 后可以通過 add 和 commit 方法將數據保存到數據庫中。

session.add(user1)
session.add(user2)
session.add(user3)
session.commit()

對數據庫中的數據進行查詢和修改

SQLAlchemy 通過 query 來對數據進行查詢,可以通過 filter 方法對查詢結果進行篩選。

user = session.query(User).filter(User.id<2).all()
print(user)
user = session.query(User).filter(User.id<=5).all()
print(user)

以上代碼通過 query 獲取數據庫中所有 User 數據,然后通過 filter 方法篩選出 id 小于 2 和 id 小于等于 5 的數據。

數據庫的修改可以通過 merge 和 update 來實現

user1.name = 'admin'
session.merge(user1)
user4 = User(name='fred', fullname='Fred Flintstone', nickname='freddy')
session.merge(user4)
session.query(User).filter(User.id==2).update({'name':'test'})
user = session.query(User).filter(User.id<=5).all()
print(user)

使用 merge 修改數據,當數據中存在該數據時修改,不存在是將當前數據插入數據庫中。

代碼運行結果

以上示例代碼的運行結果如下

2019-02-16 21:45:23,919 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
2019-02-16 21:45:23,919 INFO sqlalchemy.engine.base.Engine ()
2019-02-16 21:45:23,919 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
2019-02-16 21:45:23,919 INFO sqlalchemy.engine.base.Engine ()
2019-02-16 21:45:23,920 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("users")
2019-02-16 21:45:23,920 INFO sqlalchemy.engine.base.Engine ()
2019-02-16 21:45:23,921 INFO sqlalchemy.engine.base.Engine
CREATE TABLE users (
  id INTEGER NOT NULL,
  name VARCHAR,
  fullname VARCHAR,
  nickname VARCHAR,
  PRIMARY KEY (id)
)


2019-02-16 21:45:23,921 INFO sqlalchemy.engine.base.Engine ()
2019-02-16 21:45:23,922 INFO sqlalchemy.engine.base.Engine COMMIT
2019-02-16 21:45:23,924 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2019-02-16 21:45:23,925 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, nickname) VALUES (?, ?, ?)
2019-02-16 21:45:23,925 INFO sqlalchemy.engine.base.Engine ('ed', 'Ed Jones', 'edsnickname')
2019-02-16 21:45:23,926 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, nickname) VALUES (?, ?, ?)
2019-02-16 21:45:23,926 INFO sqlalchemy.engine.base.Engine ('wendy', 'Wendy Williams', 'windy')
2019-02-16 21:45:23,926 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, nickname) VALUES (?, ?, ?)
2019-02-16 21:45:23,926 INFO sqlalchemy.engine.base.Engine ('mary', 'Mary Contrary', 'mary')
2019-02-16 21:45:23,927 INFO sqlalchemy.engine.base.Engine COMMIT
2019-02-16 21:45:23,929 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2019-02-16 21:45:23,929 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.nickname AS users_nickname
FROM users
WHERE users.id < ?
2019-02-16 21:45:23,929 INFO sqlalchemy.engine.base.Engine (2,)
[<User(name='ed', fullname='Ed Jones', nickname='edsnickname')>]
2019-02-16 21:45:23,931 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.nickname AS users_nickname
FROM users
WHERE users.id <= ?
2019-02-16 21:45:23,931 INFO sqlalchemy.engine.base.Engine (5,)
[<User(name='ed', fullname='Ed Jones', nickname='edsnickname')>, <User(name='wendy', fullname='Wendy Williams', nickname='windy')>, <User(name='mary', fullname='Mary Contrary', nickname='mary')>]
2019-02-16 21:45:23,932 INFO sqlalchemy.engine.base.Engine UPDATE users SET name=? WHERE users.id = ?
2019-02-16 21:45:23,932 INFO sqlalchemy.engine.base.Engine ('admin', 1)
2019-02-16 21:45:23,933 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, nickname) VALUES (?, ?, ?)
2019-02-16 21:45:23,933 INFO sqlalchemy.engine.base.Engine ('fred', 'Fred Flintstone', 'freddy')
2019-02-16 21:45:23,934 INFO sqlalchemy.engine.base.Engine UPDATE users SET name=? WHERE users.id = ?
2019-02-16 21:45:23,934 INFO sqlalchemy.engine.base.Engine ('test', 2)
2019-02-16 21:45:23,935 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.nickname AS users_nickname
FROM users
WHERE users.id <= ?
2019-02-16 21:45:23,935 INFO sqlalchemy.engine.base.Engine (5,)
[<User(name='admin', fullname='Ed Jones', nickname='edsnickname')>, <User(name='test', fullname='Wendy Williams', nickname='windy')>, <User(name='mary', fullname='Mary Contrary', nickname='mary')>, <User(name='fred', fullname='Fred Flintstone', nickname='freddy')>]

由于我們設置 create_engine 中 echo 為 True,因此在執行結果中包含了 SQLAlchemy 打印的 SQL 語句,我們可以取消 crete_engine 中的 echo

engine = create_engine('sqlite:///./sqlalchemy.sqlite')

此時的執行結果如下:

[<User(name='ed', fullname='Ed Jones', nickname='edsnickname')>]
[<User(name='ed', fullname='Ed Jones', nickname='edsnickname')>, <User(name='wendy', fullname='Wendy Williams', nickname='windy')>, <User(name='mary', fullname='Mary Contrary', nickname='mary')>]
[<User(name='admin', fullname='Ed Jones', nickname='edsnickname')>, <User(name='test', fullname='Wendy Williams', nickname='windy')>, <User(name='mary', fullname='Mary Contrary', nickname='mary')>, <User(name='fred', fullname='Fred Flintstone', nickname='freddy')>]

關于怎么在Python 中使用SQLAlchemy操作數據庫就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

舒兰市| 怀柔区| 亳州市| 辽源市| 锡林浩特市| 赣榆县| 疏附县| 漾濞| 蓬溪县| 麻栗坡县| 腾冲县| 青岛市| 定西市| 白山市| 南阳市| 泸定县| 临夏县| 井陉县| 黄冈市| 榕江县| 合水县| 德令哈市| 奉新县| 玛纳斯县| 阿克陶县| 军事| 图木舒克市| 吴桥县| 中宁县| 陆河县| 潍坊市| 青岛市| 吉木萨尔县| 南木林县| 长沙县| 盘锦市| 宣化县| 清新县| 北票市| 西林县| 银川市|