1. 程式人生 > 其它 >express+node搭建自己的本地後臺

express+node搭建自己的本地後臺

目錄

1. 常用的sqlalchemy欄位型別

型別名 python中型別 說明
Integer int 普通整數,一般是32
SmallInteger int 取值範圍小的整數,一般是16
BigInteger intlong 不限制精度的整數
Float float 浮點數
Numeric decimal.Decimal
普通整數,一般是32
String str 變長字串
Text str 變長字串,對較長或不限長度的字串做了優化
Unicode unicode 變長Unicode字串
UnicodeText unicode 變長Unicode字串,對較長或不限長度的字串做了優化
Boolean bool 布林值
Date datetime.date 時間
Time datetime.datetime 日期和時間
LargeBinary str 二進位制檔案

2. 常用的Column選項

選項名 說明
primary_key 如果為True,代表表的主鍵
unique 如果為True,代表這列不允許出現重複的值
index 如果為True,為這列建立索引,提高查詢效率
nullable 如果為True,允許有空值,如果為False,不允許有空值
default 為這列定義預設值
comment 欄位註釋

3. 常用的關係選項

選項名 說明
backref 在關係的另一模型中新增反向引用
primaryjoin 明確指定兩個模型之間使用的聯結條件
uselist 如果為False,不使用列表,而使用標量值
order_by 指定關係中記錄的排序方式
secondary 指定多對多中記錄的排序方式

4. 簡單操作

安裝sqlalchemy模組

pip install sqlalchemy

4.1 連線資料庫並建立表

# 匯入模組
from sqlalchemy import create_engine, Column, Integer, String, DATETIME
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# 建立物件的基類
Base = declarative_base()

# 定義表物件
class Users(Base):
   # 表的名字
    __tablename__ = "user"
  
    # 表的結構
    id = Column(Integer, primary_key=True)
    username = Column(String(64), unique=True, nullable=False, comment="使用者名稱")
    password = Column(String(64), unique=True, nullable=False, comment="密碼")

    def __init__(self, id, username, password, create_time, update_time):
        self.id = id
        self.username = username
        self.password = password


# 初始化資料庫連線
engine = create_engine("mysql+pymysql://root:[email protected]/system_user?charset=utf8mb4", echo=True)
# 建立DBsession型別
DBSession = sessionmaker(bind=engine)
# 建立定義的表
Base.metadata.create_all(engine)

create_engine()用來初始化資料庫連線。SQLAlchemy用一個字串表示連線資訊:

'資料庫型別+資料庫驅動名稱://使用者名稱:口令@機器地址:埠號/資料庫名'

Engine內部維護了一個Pool(連線池)和Dialect(方言),方言來識別具體連線資料庫種類。

create_engine還有其它可選的引數,比如:

engine = create_engine("mysql+pymysql://root:[email protected]/system_user?charset=utf8mb4", 
                       echo=True, 
                       pool_size=5,
                       pool_recycle=-1,
                       query_cache_size=500)
# echo=True:當設定為True時會將orm語句轉化為sql語句列印,一般debug的時候可用
# pool_size:連線池的大小,預設為5個,設定為0時表示連線無限制
# pool_recycle:設定時間以限制資料庫多久沒連線自動斷開,預設-1沒有限制
# query_cache_size:用於快取 SQL 字串的快取大小查詢的形式。設定為零以禁用快取。

4.2 插入資料

engine = create_engine("mysql+pymysql://root:[email protected]/system_user?charset=utf8mb4", echo=True)
DBSession = sessionmaker(bind=engine)
session = DBSession()
# 定義新增的資料
user_add = Users(
    id=1,
    username="abc",
    password="123456"
)
# 利用session.add()向資料庫新增
session.add(user_add)
session.commit()
session.close()

4.3 查詢資料

user_message = session.query(Users).filter_by(id=1).all()
# user_message = session.query(Users).filter_by(Users.id == 1).all()
for i in user_message:
    print(i.username)
    
# 通過session.query()我們查詢返回了一個Query物件,此時還沒有去具體的資料庫中查詢,只有當執行具體的.all(),.first()等函式時才會真的去操作資料庫。
filter filter_by
支援所有比較運算子,相等比較用比較用== 只能使用"=","!="和"><"
過濾用類名.屬性名 過濾用屬性名
不支援組合查詢,只能連續呼叫filter變相實現 引數是**kwargs,支援組合查詢
支援and,or和in等

4.4 更改資料

session.query(Users).filter_by(id=1).update({"username": "ccc"})
# 或者
user = session.query(Users).filter_by(id=1).first()
user.username = "aaa"
session.add(user)

4.5 刪除資料

delete_user = session.query(Users).filter_by(id=1).first()
if delete_user:
    session.delete(delete_user)
    session.commit()
# 或者
session.query(Users).filter_by(id=1).delete()
session.commit()

5. 特殊操作

5.1 時間列自動更新

from sqlalchemy import create_engine, Column, Integer, String, TIMESTAMP, text

...
create_time = Column(TIMESTAMP, server_default=text("CURRENT_TIMESTAMP"), comment="建立時間", nullable=False)
update_time = Column(TIMESTAMP, server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"), comment="更新時間", nullable=False)
...

5.2 批量新增

# 第一種方法
user_add_list = [
    Users(id=1, username="aaa", password="1", create_time=None, update_time=None),
    Users(id=2, username="bbb", password="2", create_time=None, update_time=None),
    Users(id=3, username="ccc", password="3", create_time=None, update_time=None),
    Users(id=4, username="ddd", password="4", create_time=None, update_time=None),
]
session.add_all(user_add_list)
session.commit()

# 第二種方法
user_add_list = [
    Users(id=1, username="aaa", password="1", create_time=None, update_time=None),
    Users(id=2, username="bbb", password="2", create_time=None, update_time=None),
    Users(id=3, username="ccc", password="3", create_time=None, update_time=None),
    Users(id=4, username="ddd", password="4", create_time=None, update_time=None),
]
session.bulk_save_objects(user_add_list)
session.commit()

5.3 查詢引數

# 返回所有符合條件的記錄
session.query(Users).filter_by(id=1).all()
# 返回符合條件的第一條記錄
session.query(Users).filter_by(id=1).first()
# 返回一個物件,如果有多個報錯
session.query(Users).filter_by(Users.id=1).one()
# 限制返回條數
session.query(Users).filter(Users.id=1).limit(2).all()
# 從第3條開始返回記錄
session.query(Users).filter(Users.id=1).offset(2).all()
# 切片返回記錄
session.query(Users).filter(Users.id=1).slice(2,3).all()
# 按順序排序返回記錄
session.query(Users).filter(Users.username="abc").order_by(id).all()
# 降序返回記錄
session.query(Users).filter(Users.username="abc").order_by(desc(id)).all()
# 不等於
session.query(Users).filter(Users.id!=1).all()
# 模糊匹配
session.query(Users).filter(Users.username.like("aaa")).all()
session.query(Users).filter(Users.username.notlike("aaa")).all()
# 成員屬於/不屬於
session.query(User).filter(User.username.in_(['aaa','bbb'])).all()
session.query(User).filter(User.username.notin_(['aaa','bbb'])).all()
# 空判斷
session.query(User).filter(User.username==None).all()
session.query(User).filter(User.username.is_(None)).all()
session.query(User).filter(User.username.isnot(None)).all()
# 多條件
session.query(User).filter(User.username.isnot(None),User.password=='123').all()
# and or
session.query(User).filter(or_(User.username=='aaa',User.password=='123')).all()
session.query(User).filter(and_(User.username=='bbb',User.password=='111')).all()
# 計算個數
session.query(Users).filter_by(id=1).count()