python3之SQLAlchemy
1、SQLAlchemy介紹
SQLAlchemy是Python SQL工具包和對(duì)象關(guān)系映射器,為應(yīng)用程序開發(fā)人員提供了SQL的全部功能和靈活性。
它提供了一整套眾所周知的企業(yè)級(jí)持久性模式,專為高效和高性能的數(shù)據(jù)庫(kù)訪問而設(shè)計(jì),適用于簡(jiǎn)單的Pythonic域語言。
SQLAlchemy對(duì)象關(guān)系映射器提供了一種將用戶定義的Python類與數(shù)據(jù)庫(kù)表關(guān)聯(lián)的方法,以及這些類(對(duì)象)在其相應(yīng)表中具有行的實(shí)例。它包括一個(gè)系統(tǒng),可以透明地同步對(duì)象及其相關(guān)行之間狀態(tài)的所有變化(稱為工作單元),以及根據(jù)用戶定義的類和它們之間定義的關(guān)系來表示數(shù)據(jù)庫(kù)查詢的系統(tǒng)。
2、sqlalchemy安裝鏈接
可以使用easy_install或者pip安裝SQLAlchemy:
easy_install sqlalchemy 或者 pip install sqlalchemy查看SQLAlchemy版本信息
In [1]: import sqlalchemyIn [2]: sqlalchemy.__version__ Out[2]: '1.2.4'SQLAlchemy是Python編程語言下的一款ORM框架,該框架建立在數(shù)據(jù)庫(kù)API之上,使用關(guān)系對(duì)象映射進(jìn)行數(shù)據(jù)庫(kù)操作,簡(jiǎn)言之便是:將對(duì)象轉(zhuǎn)換成SQL,然后使用數(shù)據(jù)API執(zhí)行SQL并獲取執(zhí)行結(jié)果。
操作數(shù)據(jù)庫(kù)方法1:
使用 Engine/ConnectionPooling/Dialect 進(jìn)行數(shù)據(jù)庫(kù)操作,Engine使用ConnectionPooling連接數(shù)據(jù)庫(kù),然后再通過Dialect執(zhí)行SQL語句。
連接數(shù)據(jù)庫(kù)使用create_engine():
from sqlalchemy import create_engine #鏈接數(shù)據(jù)庫(kù) engine = create_engine('mysql+pymysql://test:123@10.0.0.10:3306/test') #創(chuàng)建表 engine.execute('create table test1(id int,name varchar(48),salary int not null)') #插入表數(shù)據(jù) engine.execute("insert into test1(id,name,salary) values(1,'zs',88888)") #查看數(shù)據(jù) result = engine.execute('select * from test1') print(result.fetchall())不同數(shù)據(jù)庫(kù)和API鏈接數(shù)據(jù)庫(kù)的操作格式:
MySQL-Pythonmysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>pymysqlmysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]MySQL-Connectormysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>cx_Oracleoracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]更多詳見:http://docs.sqlalchemy.org/en/latest/dialects/index.html操作數(shù)據(jù)庫(kù)方法2:
使用 Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 進(jìn)行數(shù)據(jù)庫(kù)操作。Engine使用Schema Type創(chuàng)建一個(gè)特定的結(jié)構(gòu)對(duì)象,之后通過SQL Expression Language將該對(duì)象轉(zhuǎn)換成SQL語句,然后通過?ConnectionPooling 連接數(shù)據(jù)庫(kù),再然后通過?Dialect 執(zhí)行SQL,并獲取結(jié)果。
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/2/28 16:06 # @Author : Py.qi # @File : sqlalchemy_mysql_metadata.py # @Software: PyCharmfrom sqlalchemy import select,create_engine, Table, Column, Integer, String, MetaData, ForeignKeymetadata = MetaData() #創(chuàng)建表 user = Table('teacher', metadata,Column('id', Integer, primary_key=True),Column('name', String(20)), ) #創(chuàng)建表 color = Table('student', metadata,Column('id', Integer, primary_key=True),Column('name', String(20)), ) #鏈接數(shù)據(jù)庫(kù) engine = create_engine("mysql+pymysql://test:123@10.0.0.10:3306/test", max_overflow=5) #執(zhí)行引擎語句 #metadata.create_all(engine) #獲取sql游標(biāo) conn = engine.connect() # 創(chuàng)建SQL語句,插入數(shù)據(jù) sql=user.insert().values(name='aa') sql1=user.insert().values(name='bb') #conn.execute(sql) #conn.close()#刪除數(shù)據(jù) #sql3 = user.delete().where(user.c.id > 1) #conn.execute(sql3) #conn.close() #更新數(shù)據(jù) #sql4 = user.update().where(user.c.name == 'fenzi').values(name='dddd') #conn.execute(sql4) #查詢數(shù)據(jù) 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()操作數(shù)據(jù)庫(kù)方法3:
使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有組件對(duì)數(shù)據(jù)進(jìn)行操作。根據(jù)類創(chuàng)建對(duì)象,對(duì)象轉(zhuǎn)換成SQL,執(zhí)行SQL。
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/2/28 17:16 # @Author : Py.qi # @File : sqlalchemy_expression.py # @Software: PyCharmfrom sqlalchemy import Column,Integer,String from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base #echo輸出詳細(xì) engine = create_engine("mysql+pymysql://test:123@10.0.0.10:3306/test",max_overflow=5,echo=True) base=declarative_base() #創(chuàng)建基類 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的所有子類,按照子類的結(jié)構(gòu)在數(shù)據(jù)庫(kù)中生成對(duì)應(yīng)的數(shù)據(jù)表信息 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) # ]) #寫入數(shù)據(jù)庫(kù) #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官網(wǎng):http://www.sqlalchemy.org/
轉(zhuǎn)載于:https://www.cnblogs.com/zhangxinqi/p/8480049.html
總結(jié)
以上是生活随笔為你收集整理的python3之SQLAlchemy的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式-观察者模式 实现
- 下一篇: 亲历dataguard的一些经验问答题