1、SQLAlchemy介紹
SQLAlchemy是Python SQL工具包和對象關系映射器,為應用程序開發人員提供了SQL的全部功能和靈活性。
它提供了一整套眾所周知的企業級持久性模式,專為高效和高性能的數據庫訪問而設計,適用於簡單的Pythonic域語言。
SQLAlchemy對象關系映射器提供了一種將用戶定義的Python類與數據庫表關聯的方法,以及這些類(對象)在其相應表中具有行的實例。它包括一個系統,可以透明地同步對象及其相關行之間狀態的所有變化(稱為工作單元),以及根據用戶定義的類和它們之間定義的關系來表示數據庫查詢的系統。
2、sqlalchemy安裝鏈接
可以使用easy_install或者pip安裝SQLAlchemy:
easy_install sqlalchemy
或者
pip install sqlalchemy
查看SQLAlchemy版本信息
In [1]: import sqlalchemy In [2]: sqlalchemy.__version__ Out[2]: '1.2.4'
SQLAlchemy是Python編程語言下的一款ORM框架,該框架建立在數據庫API之上,使用關系對象映射進行數據庫操作,簡言之便是:將對象轉換成SQL,然后使用數據API執行SQL並獲取執行結果。
操作數據庫方法1:
使用 Engine/ConnectionPooling/Dialect 進行數據庫操作,Engine使用ConnectionPooling連接數據庫,然后再通過Dialect執行SQL語句。
連接數據庫使用create_engine():
from sqlalchemy import create_engine #鏈接數據庫 engine = create_engine('mysql+pymysql://test:123@10.0.0.10:3306/test') #創建表 engine.execute('create table test1(id int,name varchar(48),salary int not null)') #插入表數據 engine.execute("insert into test1(id,name,salary) values(1,'zs',88888)") #查看數據 result = engine.execute('select * from test1') print(result.fetchall())
不同數據庫和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:
使用 Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 進行數據庫操作。Engine使用Schema Type創建一個特定的結構對象,之后通過SQL Expression Language將該對象轉換成SQL語句,然后通過 ConnectionPooling 連接數據庫,再然后通過 Dialect 執行SQL,並獲取結果。
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/2/28 16:06 # @Author : Py.qi # @File : sqlalchemy_mysql_metadata.py # @Software: PyCharm from sqlalchemy import select,create_engine, Table, Column, Integer, String, MetaData, ForeignKey metadata = MetaData() #創建表 user = Table('teacher', metadata, Column('id', Integer, primary_key=True), Column('name', String(20)), ) #創建表 color = Table('student', metadata, Column('id', Integer, primary_key=True), Column('name', String(20)), ) #鏈接數據庫 engine = create_engine("mysql+pymysql://test:123@10.0.0.10:3306/test", max_overflow=5) #執行引擎語句 #metadata.create_all(engine) #獲取sql游標 conn = engine.connect() # 創建SQL語句,插入數據 sql=user.insert().values(name='aa') sql1=user.insert().values(name='bb') #conn.execute(sql) #conn.close() #刪除數據 #sql3 = user.delete().where(user.c.id > 1) #conn.execute(sql3) #conn.close() #更新數據 #sql4 = user.update().where(user.c.name == 'fenzi').values(name='dddd') #conn.execute(sql4) #查詢數據 sql5=select([user,]) #sql6 = select([user.c.id,]) #sql7 = select([user.c.id, color.c.name]).where(user.c.id=='6') # sql = select([user.c.name]).order_by(user.c.name) # sql = select([user]).group_by(user.c.name) result = conn.execute(sql5) print(result.fetchall()) conn.close()
操作數據庫方法3:
使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有組件對數據進行操作。根據類創建對象,對象轉換成SQL,執行SQL。
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/2/28 17:16 # @Author : Py.qi # @File : sqlalchemy_expression.py # @Software: PyCharm from sqlalchemy import Column,Integer,String from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base #echo輸出詳細 engine = create_engine("mysql+pymysql://test:123@10.0.0.10:3306/test",max_overflow=5,echo=True) base=declarative_base() #創建基類 class user(base): __tablename__ = 'users' id = Column(Integer,primary_key=True,autoincrement=True) hostname=Column(String(64),unique=True,nullable=False) ip_addr=Column(String(56),unique=True,nullable=False) port=Column(Integer,default=22) #尋找Base的所有子類,按照子類的結構在數據庫中生成對應的數據表信息 base.metadata.create_all(engine)
Session=sessionmaker(bind=engine) session=Session() #增,插入單行 #u = user(hostname='zs',ip_addr='333',port=22) #session.add(u) #插入多行 #session.add_all([user(hostname='ls',ip_addr='111',port=873), # user(hostname='ww',ip_addr='888',port=23), # user(hostname='dff',ip_addr='567',port=3306) # ]) #寫入數據庫 #session.commit() #刪除 #session.query(user).filter(user.id > 3).delete() #session.commit() #修改 # session.query(user).filter(user.id == 3).update({'hostname':'feng','port':3389}) # session.commit() #查 #ret=session.query(user).filter_by(hostname='feng').first() # ret = session.query(user).filter_by(hostname='feng').all() # print(ret) ret = session.query(user).filter(user.hostname.in_(['sb','bb'])).all() # print(ret) # ret = session.query(User.name.label('name_label')).all() # print(ret,type(ret)) # ret = session.query(User).order_by(User.id).all() # print(ret) # ret = session.query(User).order_by(User.id)[1:3] print(ret) session.commit()
SQLAlchemy官網:http://www.sqlalchemy.org/