python ORM - sqlalchemy 操作使用
阿新 • • 發佈:2018-03-10
== from python filter OS char 一個 efault 連接數
python操作數據庫
使用 ORM - sqlalchemy,pymsql
安裝:
pip install pymsq
pip install sqlalchemy
一、 ‘‘‘連接數據庫‘‘‘
‘‘‘導入必須的包‘‘‘
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 基本設置
HOSTNAME = ‘127.0.0.1‘ # 本地 liunx
POST = ‘ 3306‘ # mysql 默認端口
DATABASE = ‘mydb‘ # 數據庫名字
USERNAME = ‘admin‘ # 用戶名
PASSWORD = ‘Root110qwe‘ # 密碼
# 固定寫法
db_url = ‘mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8‘.format( USERNAME, PASSWORD, HOSTNAME, POST, DATABASE )
# 這裏的 db_url 就是連接數據庫的路徑。“mysql+mysqldb”指定了使用 MySQL-Python 來連
engine = create_engine(db_url,echo=False) # 初始化數據庫連接,
# create_engine() 會返回一個數據庫引擎,echo 參數為 True 時,會顯示每條執行的 SQL 語句,生產環境下可關閉。
Base = declarative_base(engine)Session = sessionmaker(engine)
# 創建對象的基類
# 創建與數據庫連接的Session類
session = Session()
# session可以視為數據庫連接
# sessionmaker() 會生成一個數據庫會話類。這個類的實例可以當成一個數據庫連接,它同時還記錄了一些查詢的數據,並決定什麽時候執行 SQL 語句。
if __name__ == ‘__main__‘: # 測試是否連接成功
connection = engine.connect()
result = connection.execute(‘select 1‘)
print(result.fetchone())
二 、 ‘‘‘創建 類—表 映射關系‘‘‘
創建表的同時,也映射數據庫;也可以單獨創建表,
# -*- coding:utf-8 -*-
from datetime import datetime
from sqlalchemy import Column,Integer,String,DateTime
from connect import Base,session # 這裏connect前面加上點之後 不能直接執行文件,但是可以外部調用
‘‘‘創建表 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)) # 密碼長度 50
creatime = Column(DateTime,default=datetime.now) # 創建時間
@classmethod
def by_name(cls,name): # 定義查詢函數,返回查詢結果
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
‘‘‘創建表 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 要關聯的表的名字
backref 返回 details 方法(屬性)
uselist 默認為True, 表示一對多關系(False表示一對一)
cascade 自動處理關系 相當於mysql中的ON DELETE 類似 有 7 個可選參數
在代碼層控制
‘‘‘
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
‘‘‘ 創建表的另一種方法 這種方法沒有映射,如果需要映射 還需重新創建 類,重寫 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)
)
‘‘‘創建表 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)# 創建映射關系 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() # 執行
三 、 ‘‘‘簡單的 增、刪、查、改 操作 ‘‘‘
# -*- coding:utf-8 -*- from connect import session from user_module import User def add_user(): # 增 # persson = User(username=‘xiaohong‘,password=‘qwe123‘,id=1) # session.add(persson) # 提交單條數據 # 一次提交多條數據 , 註意 這裏 all 裏面是列表 session.add_all( [ User(username=‘小紅‘, password=‘qwe123mmm‘), User(username=‘老王‘, password=‘12345nnnnn‘), User(username=‘小明‘, password=‘654321hhhhh‘), ] ) session.commit() # 必須提交 def search_user(): # 查詢 默認repr 便於機器閱讀,需要重寫 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: # 如果查到的數據量大,就是用循環刪除 session.delete(i) session.commit() if __name__ == ‘__main__‘: add_user() # search_user() # delete_user() # update_user()
推薦文章:廖雪峰的 使用SQLAlchemy
腳本之家的 Python SQLAlchemy基本操作和常用技巧(包含大量實例,非常好)
z+j 的 Python SqlAlchemy使用方法
K.Takanashi 的 SQLAlchemy的初步使用
SQLAlchemy入門(一)
python ORM - sqlalchemy 操作使用