基於sqlalchemy的MYSQL數據庫操作

一、機制
     

      對象關係映射(Object Relational Mapping,ORM),將對數據庫的操作,映射爲對類的操作,一個表對應一個類。sqlalchemy無法獨立對數據庫進行操作,需要藉助其他第三方插件,這裏我運用了pymysql。

sqlalchemy建議安裝1.3.15版本,太舊的版本可能會出現報錯。

二、基本操作

由於要做類映射,對錶new_table 增加了一列主鍵

alter table   newtable add id int unsigned not Null auto_increment primary key;

import sqlalchemy
print(sqlalchemy.__version__)
from sqlalchemy import  create_engine
from sqlalchemy.ext.declarative import  declarative_base
from sqlalchemy import  Column,Integer,String
from sqlalchemy.orm import sessionmaker
from sqlalchemy import and_, or_

ip ='127.0.0.1'
port = '3306'
db = 'test_databases'
user = 'root'
passwd = '3gynj20J'
DB_URI ='mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(user,passwd,ip,port,db)

engine=create_engine(DB_URI)
print(engine)   # Engine(mysql+pymysql://root:***@127.0.0.1:3306/test_databases?charset=utf8)

Base = declarative_base(engine)   #創建基類,所有表對應的類必須繼承自這個基類

# 創建會話
Session = sessionmaker(engine)
# 此條必須,每次執行數據庫操作時,都需要創建一個Connection
session = Session()

# 創建表對應的類
class New_Table(Base):
    __tablename__ = 'newtable'
    id = Column(Integer,nullable=False,primary_key=True, autoincrement=True)
    key1 = Column(String(20),nullable=False)
    key2 = Column(Integer,nullable=False)

def add_1(a,b):
    row = New_Table(key1=a,key2=b)
    session.add(row)
    session.commit()
# add_1('test',0)

def add_N(List):
    tmp=[]
    for item in List:
        row =  New_Table(key1=item[0],key2=item[1])
        tmp.append(row)
    session.add_all(tmp)
    session.commit()
# add_N([['BB',22],['CC',33]])

def search():
    #查所有
    re = session.query(New_Table).filter_by(key2 =22).all()   # 返回一系列對象的列表
    re = session.query(New_Table).filter(New_Table.key2==22).all()
    # print(re[0].id)
    #查第一條
    re =session.query(New_Table).filter_by(key2 =22).first()
    # print(re.id)
    # #查一條
    re =session.query(New_Table).filter_by(key2 =22).one()
    # print(re.id)
    re =session.query(New_Table).get(6) # 用主鍵查
    # print(re.key2)
    #查0或1
    re = session.query(New_Table).filter_by(key2 =22).scalar()  # 若存在爲一個對象,若不存在則爲None
    # print(re.id)
# search()

def update(a,b):
    session.query(New_Table).filter_by(key1=a).update({New_Table.key1:a,New_Table.key2:b}) # update 裏的字典可不寫全
    session.query(New_Table).filter_by(key1=a).update({New_Table.key2: b+1})
    session.commit()
    # return
# update('BB',100)

def delete(a):
    re=session.query(New_Table).filter_by(key1=a).one()
    session.delete(re)
    session.commit()
# delete('test')

#與或非
def and_or(a,b):
    # re = session.query(New_Table).filter(and_(New_Table.key1==a,New_Table.key2==b)).one()
    # print(re.id)
    re = session.query(New_Table).filter(or_(New_Table.key2 == a, New_Table.key2 == b)).all()
    print([i.id for i in re])

# and_or('BB',101)
and_or(2,33)

三、常見報錯

1、could not assemble any primary key columns for mapped table 'newtable'

原來的表沒有主建,用alter語句增加一列主鍵即可

alter table   newtable add id int unsigned not Null auto_increment primary key;

2、Unknown system variable 'tx_isolation  sqlalchemy

安裝的sqlalchemy 太舊了,升級一下。

 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade sqlalchemy --ignore-installed

 

四、擴展推薦

https://blog.csdn.net/qq_36019490/article/details/96883453

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章