python SQLAchemy經常使用語法

SQLAlchemy是Python編程語言下的一款ORM框架,該框架創建在數據庫API之上,使用關係對象映射進行數據庫操做,簡言之即是:將對象轉換成SQL,而後使用數據API執行SQL並獲取執行結果。html

SQLAchemy下載

 pip3 install sqlalchemy

SQLAchemy使用

SQLAlchemy自己沒法操做數據庫,其必須以來pymsql等第三方插件,Dialect用於和數據API進行交流,根據配置文件的不一樣調用不一樣的數據庫API,從而實現對數據庫的操做,如:python

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
 一、用sqlalchemy建表
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String

# 鏈接方式 mysql+pymysql 用戶名 root 密碼 123456 主機 localhost 庫 testdb encoding 字符集
engine = create_engine("mysql+pymysql://root:123456@localhost/testdb",encoding='utf-8', echo=True)

Base = declarative_base()  # 生成orm基類

class User(Base):
    __tablename__ = 'user'  # 表名
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))


Base.metadata.create_all(engine)  # 建立表結構

 

若是數據庫已經有了這個表了就不會建立了,也不會報錯。mysql

添加數據

先導入sessionmakersql

from sqlalchemy.orm import sessionmaker

 

Session_class = sessionmaker(bind=engine)  # 建立與數據庫的會話session class ,注意,這裏返回給session的是個class,不是實例
Session = Session_class()  # 生成session實例 cursor

user_obj1 = User(name="alex", password="alex3714")  # 生成你要建立的數據對象
user_obj2 = User(name="jack", password="122") # 生成你要建立的數據對象 print(user_obj.name, user_obj.id) # 此時還沒建立對象呢,不信你打印一下id發現仍是None Session.add(user_obj1) # 把要建立的數據對象添加到這個session裏, 一會統一建立
Session.add(user_obj2) # 把要建立的數據對象添加到這個session裏, 一會統一建立 print(user_obj.name, user_obj.id) # 此時也依然還沒建立 Session.commit() # 現此才統一提交,建立數據

 

數據查詢
Session_class = sessionmaker(bind=engine)  # 建立與數據庫的會話session class ,注意,這裏返回給session的是個class,不是實例
Session = Session_class()  # 生成session實例 cursor
data = Session.query(User).filter_by(name="alex").all() #filter_by 查出來的是一個列表
print(data)

 

data = Session.query(User).filter_by().all()

若是filter_by沒有設置條件就把表中的數據都查出來了。數據庫

雖然是4條數據,可是徹底看不懂,轉換下數據顯示格式。編程

在User類中添加一個方法:session

class User(Base):
    __tablename__ = 'user'  # 表名
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

    def __repr__(self):         #添加的方法
        return "<%s name:%s>" % (self.id,self.name)

 

 first() 取數據的第一條 , 沒有last()方法oracle

data = Session.query(User).filter_by().first()  
filter_by和filter的小區別

某些條件下用filter_by:app

data = Session.query(User).filter_by(id=2).all()

 轉成filter就要寫成:框架

data = Session.query(User).filter(User.id==2).all()

 還有就是filter_by不能直接寫 > <這種條件 要用filter。

data = Session.query(User).filter(User.id>2).all()
 多個條件
data = Session.query(User).filter(User.id>2).filter(User.id<5).all()

 修改數據

仍是經過面向對象的方式修改。

data = Session.query(User).filter(User.id>2).filter(User.id<5).first()
print(data)
data.name = 'Jack Liu'
data.password = 'Shit happens'
Session.commit()

 原數據的name

回滾

原理和事務的回滾是同樣的。

my_user = Session.query(User).filter_by(id=1).first()
my_user.name = "Jack"

fake_user = User(name='Rain', password='12345')
Session.add(fake_user)

print(Session.query(User).filter(User.name.in_(['Jack', 'rain'])).all())  # 這時看session裏有你剛添加和修改的數據

Session.rollback()  # 此時你rollback一下
print('after rollback')
print(Session.query(User).filter(User.name.in_(['Jack', 'rain'])).all())  # 再查就發現剛纔添加的數據沒有了。

 

 

統計和分組

統計 count()

Session.query(User).filter(User.name.in_(['Jack', 'rain'])).count()

 分組

from sqlalchemy import func
Session.query(func.count(User.name),User.name).group_by(User.name).all()

 

 

第二種建表方式 不經常使用 瞭解便可
 1 from sqlalchemy import Table, MetaData, Column, Integer, String, ForeignKey
 2 from sqlalchemy.orm import mapper
 3 
 4 metadata = MetaData()
 5 #表結構 經過Table建立表
 6 user = Table('user', metadata,
 7              Column('id', Integer, primary_key=True),
 8              Column('name', String(50)),
 9              Column('fullname', String(50)),
10              Column('password', String(12))
11              )
12 
13 
14 class User(object):  #不繼承Base 自定義類
15     def __init__(self, name, fullname, password):
16         self.name = name
17         self.fullname = fullname
18         self.password = password
19 
20 
21 mapper(User,  user)  #把這個類和表結果關聯一下
View Code
相關文章
相關標籤/搜索