SQLAlchemy的是Python SQL工具包和對象關系映射器,讓應用程序開發者的全部功能和SQL的靈活性。
它提供了一套完整的眾所周知的企業級持久性模式,專為高效率和高性能的數據庫訪問,改編成一個簡單的Python化領域語言。
SQL數據庫的行為不像對象集合的較具規模和業績開始關系; 對象集合表現得不像越抽象開始關系表和行。 SQLAlchemy的目的是滿足這兩個原則。
SQLAlchemy認為數據庫是關系代數發動機,而不僅僅是一個表的集合,行可以不僅從表中選擇,但也加入和其他select語句; 任何這些單元可被組合成一個較大的結構,SQLAlchemy的表達式語言基礎上,從它的核心這個概念。
SQLAlchemy是最有名的對象關系映射器(ORM),提供數據映射模式 ,其中類可以在開放式的,多種方式被映射到數據庫中的可選組件-允許對象模型和數據庫模式中,以開發干凈地分離從開始方式。
SQLAlchemy的對這些問題的總體思路是大多數其它SQL/ORM工具,根植于所謂的complimentarity-導向的方式完全不同; 而不是藏起來了SQL和關系對象的細節自動化墻后面,所有的進程都充分一系列組合的,透明的工具中暴露出來 。 該庫發生在自動冗余任務的工作,而開發商仍然在數據庫中是如何組織和SQL是如何構造的控制。
SQLAlchemy的主要目標是改變你對數據庫和SQL的方式!
數據庫的連接
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>
查看版本
>>> import sqlalchemy >>> sqlalchemy.__version__ '1.0.14'
單表創建
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Index, UniqueConstraint, ForeignKey
from sqlalchemy.orm import sessionmaker
engine = create_engine('mysql+pymysql://root:as@127.0.0.1:3306/tesql?charset=utf8', echo=True) # echo=True輸出生成的SQL語句
Base = declarative_base() # 生成一個ORM基類
class UserInfo(Base):
__tablename__ = 'UserInfo' # 表名
"""
創建字段
index=True 普通索引
unique=T 唯一索引
"""
id = Column(Integer, primary_key=True, autoincrement=True) # primary_key=主鍵,autoincrement=自增
name = Column(String(32))
password = Column(String(16))
__table_args__ = (
Index('id', 'name'), # 聯合索引
UniqueConstraint('name', 'password', name='name_password') # 聯合唯一索引,name索引的名字
)
# 讓查詢出來的數據顯示中文
def __repr__(self):
return self.name
Base.metadata.create_all(engine) # 把所有集成Base類的類,創建表結構上面的代碼其實就是創建了一個UserInfo表,包含了三個字段,實際執行的SQL語句如下:
CREATE TABLE `UserInfo` ( id INTEGER NOT NULL AUTO_INCREMENT, name VARCHAR(32), password VARCHAR(16), PRIMARY KEY (id), CONSTRAINT name_password UNIQUE (name, password) )
因為在創建引擎的時候加入了echo=True,所以執行的SQL會在控制臺輸出出來,以便于我們排查問題。
創建一對多表
class Favor(Base):
__tablename__ = 'favor'
nid = Column(Integer, primary_key=True, autoincrement=True)
caption = Column(String(50), default='red', unique=True)
class Person(Base):
__tablename__ = 'person'
nid = Column(Integer, primary_key=True, autoincrement=True)
favor_id = Column(Integer, ForeignKey("favor.nid"))創建多對多表
# 組 class Group(Base): __tablename__ = 'group' id = Column(Integer, primary_key=True) name = Column(String(64), unique=True, nullable=False) port = Column(Integer, default=22) # 服務器 class Server(Base): __tablename__ = 'server' id = Column(Integer, primary_key=True, autoincrement=True) hostname = Column(String(64), unique=True, nullable=False) # 服務器組,第三張表 class ServerToGroup(Base): __tablename__ = 'servertogroup' nid = Column(Integer, primary_key=True, autoincrement=True) server_id = Column(Integer, ForeignKey('server.id')) group_id = Column(Integer, ForeignKey('group.id'))
刪除表
Base.metadata.drop_all(engine) # 把所有集成Base類的類,刪除表
添加單條數據
MySesion = sessionmaker(bind=engine) session = MySesion() # 創建一條數據 users = UserInfo(name='Hello', password='World') # 把數據添加到表內 session.add(users) # 提交生效 session.commit()
添加多少數據
session.add_all([ UserInfo(name='A', password='1'), UserInfo(name='B', password='2') ]) # 提交 session.commit()
session.query(UserInfo).filter(UserInfo.name == 'a').delete() session.commit()
獲取某個表中的所有內容
result = session.query(UserInfo).all() print(result)
session.query(UserInfo).filter(UserInfo.id == 8).update({"name": "ffff"})
session.commit()獲取所有
result = session.query(UserInfo).all()
獲取指定字段
result = session.query(UserInfo.name, UserInfo.password).all()
獲取指定的
result = session.query(UserInfo).filter_by(name='b').all()# 返回的是一個列表
獲取第一條
result = session.query(UserInfo).filter_by(name='b').first() # 獲取值中的某個屬性 result.name
獲取數據出現的個數
result = session.query(UserInfo).filter_by(name='b').count()
使用and_和or_進行查詢
導入and_, or_模塊
from sqlalchemy import and_, or_
and_
for row in session.query(UserInfo).filter(and_(UserInfo.name == 'A', UserInfo.password == 1)): print(row)
or_
for row in session.query(UserInfo).filter(or_(UserInfo.name == 'Hello', UserInfo.password == 1)): print(row)
關聯查詢
創建以下數據庫
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, relationships
from sqlalchemy import Column, Integer, String, Index, UniqueConstraint, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('mysql+pymysql://root:as@127.0.0.1:3306/tesql')
Base = declarative_base()
class Son(Base):
__tablename__ = 'son'
id = Column(Integer, primary_key=True)
name = Column(String(32))
father = relationship('Father')
# 創建外鍵
father_id = Column(Integer, ForeignKey('father.id'))
class Father(Base):
__tablename__ = 'father'
id = Column(Integer, primary_key=True)
name = Column(String(32))
son = relationship('Son')
# son = relationship('Son', backref='Father') 相當于上面兩個relationship
# 生成表
Base.metadata.create_all(engine)往表里添加數據
Session = sessionmaker(bind=engine) session = Session() # 添加父親的數據 F = Father(name='as') session.add(F) session.commit() # 添加兒子的數據 S1 = Son(name='Son1', father_id=1) S2 = Son(name='Son2', father_id=1) session.add_all([S1, S2]) session.commit() # 另外一種添加數據的方式 F = session.query(Father).filter_by(id=1).first() S3 = Son(name='Son3') # 要用追加的方式進行添加,F.son是一個列表,如果不用append將會把之前的數據對應的值進行刪除 F.son.append(S3) session.add(F) session.commit()
通過父親找到所有的兒子
result = session.query(Father).filter_by(name='as').first() for n in result.son: print(n.name)
通過兒子找到父親
result = session.query(Son).filter_by(name='Son2').first()
print(result.father.name, result.name)
# son = relationship('Son', backref='Father')
# print(result.father.name, result.name)join
result = session.query(Father.name.label('kkk'), Son.name.label('ppp')).join(Son)
# label('kkk')相當于起了一個別名,等于sql中的as
print(result)
>>>>>
SELECT father.name AS kkk, son.name AS ppp
FROM father JOIN son ON father.id = son.father_id多對多實例
在上面的多對多的代碼中的Server類加入一下代碼:
g = relationship("Group", secondary=ServerToGroup.__table__, backref='s')
# secondary 如果有第三張表自動加進來然后生成數據庫表.
添加組與主機的數據
G1 = Group(name='G1', port=22) G2 = Group(name='G2', port=22) S1 = Server(hostname='Linux-node1') S2 = Server(hostname='Linux-node2') session.add_all([G1, G2, S1, S2]) session.commit()
往第三張表里面添加關聯數據
GS1 = ServerToGroup(server_id=1, group_id=1) GS2 = ServerToGroup(server_id=2, group_id=2) session.add_all([GS1, GS2]) session.commit()
通過relationship進行數據的添加
# 獲取ID=1的主機 S = session.query(Server).filter_by(id=1).first() # 獲取所有主機組 G = session.query(Group).all() S.g = G # 添加數據 session.add_all([S, ]) # 提交到數據庫中 session.commit()
#Python全棧之路 #Sqlalchemy
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。