python ORM - sqlalchemy 操作使用
生活随笔
收集整理的這篇文章主要介紹了
python ORM - sqlalchemy 操作使用
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
python操作數(shù)據(jù)庫
使用 ORM - sqlalchemy,pymsql
安裝:
pip install pymsq pip install sqlalchemy一、?'''連接數(shù)據(jù)庫'''
?'''導(dǎo)入必須的包'''from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker # 基本設(shè)置 HOSTNAME = '127.0.0.1' # 本地 liunx POST = '3306' # mysql 默認(rèn)端口 DATABASE = 'mydb' # 數(shù)據(jù)庫名字 USERNAME = 'admin' # 用戶名 PASSWORD = 'Root110qwe' # 密碼 # 固定寫法
db_url = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME,PASSWORD,HOSTNAME,POST,DATABASE )
# 這里的 db_url 就是連接數(shù)據(jù)庫的路徑?!癿ysql+mysqldb”指定了使用 MySQL-Python 來連 engine = create_engine(db_url,echo=False) # 初始化數(shù)據(jù)庫連接, # create_engine() 會(huì)返回一個(gè)數(shù)據(jù)庫引擎,echo 參數(shù)為 True 時(shí),會(huì)顯示每條執(zhí)行的 SQL 語句,生產(chǎn)環(huán)境下可關(guān)閉。
Base = declarative_base(engine) # 創(chuàng)建對象的基類
Session = sessionmaker(engine) # 創(chuàng)建與數(shù)據(jù)庫連接的Session類
session = Session() # session可以視為數(shù)據(jù)庫連接
# sessionmaker() 會(huì)生成一個(gè)數(shù)據(jù)庫會(huì)話類。這個(gè)類的實(shí)例可以當(dāng)成一個(gè)數(shù)據(jù)庫連接,它同時(shí)還記錄了一些查詢的數(shù)據(jù),并決定什么時(shí)候執(zhí)行 SQL 語句。 if __name__ == '__main__': # 測試是否連接成功connection = engine.connect()result = connection.execute('select 1')print(result.fetchone())
二 、?'''創(chuàng)建 類—表 映射關(guān)系'''
?
? 創(chuàng)建表的同時(shí),也映射數(shù)據(jù)庫;也可以單獨(dú)創(chuàng)建表,
# -*- coding:utf-8 -*-from datetime import datetime from sqlalchemy import Column,Integer,String,DateTime from connect import Base,session # 這里connect前面加上點(diǎn)之后 不能直接執(zhí)行文件,但是可以外部調(diào)用'''創(chuàng)建表 user ''' class User(Base):__tablename__ = 'user'id = Column(Integer,primary_key=True,autoincrement=True) #主鍵 ,自增長username = Column(String(20),nullable=False) # 用戶名長度 20 、非空password = Column(String(50)) # 密碼長度 50creatime = Column(DateTime,default=datetime.now) # 創(chuàng)建時(shí)間 @classmethoddef by_name(cls,name): # 定義查詢函數(shù),返回查詢結(jié)果return session.query(cls).filter(cls.username==name).first()def __repr__(self): # 重寫repr 便于閱讀return "<User(id=%s,username%s,password=%s,createtime=%s)>" % (self.id,self.username,self.password,self.creatime)from sqlalchemy.orm import relationship from sqlalchemy import ForeignKey'''創(chuàng)建表 user_details ''' class UserDetails(Base):__tablename__='user_details'id = Column(Integer, primary_key=True, autoincrement=True)id_card = Column(Integer,nullable=True,unique=True)lost_login = Column(DateTime)login_num = Column(Integer,default=0)user_id = Column(Integer,ForeignKey('user.id'))'''User 要關(guān)聯(lián)的表的名字backref 返回 details 方法(屬性)uselist 默認(rèn)為True, 表示一對多關(guān)系(False表示一對一)cascade 自動(dòng)處理關(guān)系 相當(dāng)于mysql中的ON DELETE 類似 有 7 個(gè)可選參數(shù)在代碼層控制'''userdetail = relationship('User',backref='details',uselist=False,cascade='all')def __repr__(self): # 重寫repr 便于閱讀return '<UserDetails(id=%s,id_card=%s,last_login=%s,login_num=%s,user_id=%s)>'%(self.id,self.id_card,self.lost_login,self.login_num,self.user_id)from sqlalchemy import Table''' 創(chuàng)建表的另一種方法 這種方法沒有映射,如果需要映射 還需重新創(chuàng)建 類,重寫 repr''' user_article = Table('user_article',Base.metadata,Column('user_id',Integer,ForeignKey('user.id'),primary_key=True),Column('article_id',Integer,ForeignKey('article.id'),primary_key=True))'''創(chuàng)建表 article ''' class Article(Base):__tablename__ = 'article'id = Column(Integer,primary_key=True,autoincrement=True)content = Column(String(50),nullable=True)create_time = Column(DateTime,default=datetime.now())article_user = relationship('User',backref='article',secondary=user_article)# 創(chuàng)建映射關(guān)系def __repr__(self): # 重寫repr 便于閱讀return 'Article(id=%s,content=%s,create_time=%s)'%(self.id,self.content,self.create_time)if __name__ == '__main__':Base.metadata.create_all() # 執(zhí)行
?
三 、?'''簡單的 增、刪、查、改 操作 '''
?
?
# -*- coding:utf-8 -*- from connect import session from user_module import Userdef add_user(): # 增# persson = User(username='xiaohong',password='qwe123',id=1)# session.add(persson) # 提交單條數(shù)據(jù)# 一次提交多條數(shù)據(jù) , 注意 這里 all 里面是列表 session.add_all([User(username='小紅', password='qwe123mmm'),User(username='老王', password='12345nnnnn'),User(username='小明', password='654321hhhhh'),])session.commit() # 必須提交def search_user(): # 查詢 默認(rèn)repr 便于機(jī)器閱讀,需要重寫rows = session.query(User).all()print(rows)def update_user(): # 改session.query(User).filter(User.id==2).update({User.password:1})session.commit()def delete_user(): # 刪除# rows = session.query(User).filter(User.id==2)[0]rows = session.query(User).all()print(rows)for i in rows: # 如果查到的數(shù)據(jù)量大,就是用循環(huán)刪除 session.delete(i)session.commit()if __name__ == '__main__':add_user()# search_user()# delete_user()# update_user()?
?
?
?
?
?
?
推薦文章:廖雪峰的? 使用SQLAlchemy?
?? 腳本之家的 ??Python SQLAlchemy基本操作和常用技巧(包含大量實(shí)例,非常好)
?? z+j? 的 ?Python SqlAlchemy使用方法
? K.Takanashi 的 SQLAlchemy的初步使用
SQLAlchemy入門(一)
?
轉(zhuǎn)載于:https://www.cnblogs.com/zlsgh/p/8538911.html
總結(jié)
以上是生活随笔為你收集整理的python ORM - sqlalchemy 操作使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring cloud各组件详解
- 下一篇: 近几年难得一见的一道好推理题