摘要:環境搭建安裝相應的軟件包數據庫用于連接服務器的一個庫連接數據庫從中導入,創建引擎建立與數據庫的連接。使用方法定義的映射類依據一個基類,這個基類是維系類和數據表關系的目錄。應用通常只需要有一個的實例。
SQLAlchemy
1.環境搭建安裝相應的軟件包
1.mysql數據庫
2.pymysql用于連接MySQL服務器的一個庫
3.sqlalchemy
$ pip install pymysql $ pip install sqlalchemy2.連接數據庫
從sqlalchemy中導入create_engin,創建引擎建立與數據庫的連接。
from sqlalchemy import create_engine
準備連接數據庫的數據:
HOSTNAME = "127.0.0.1" # 這里填ip地址 PORT = "3306" # 端口號 mysql一般默認為3306 DATABASE = "mydb" # 數據庫名 USERNAME = "admin" # 用戶名 PASSWORD = "rootqwe123" # 用戶登錄密碼
DB_URI的格式:
數據庫類型+數據庫驅動名稱://用戶名:密碼@機器地址:端口號/數據庫名?字符編碼
DB_URI=mysql+pymysql://
engine = create_engine(DB_URI)
我們可以嘗試著測試一下是否連接上:
print(dir(engine)),當有打印出方法時,表示連接成功。
database_connect.py
from sqlalchemy import create_engine HOSTNAME = "127.0.0.1" # 這里填ip地址 PORT = "3306" DATABASE = "mydb" USERNAME = "admin" PASSWORD = "Root110qwe" Db_Uri = "mysql+pymysql://{}:{}@{}/{}?charset=utf8".format(USERNAME,PASSWORD,HOSTNAME,DATABASE) engine = create_engine(Db_Uri) if __name__=="__main__": print(dir(engine))3.創建模型 1.聲明映像
對象關系型映射,數據庫中的表與python中的類相對應,創建的類必須繼承自sqlalchemy中的基類。
使用Declarative方法定義的映射類依據一個基類,這個基類是維系類和數據表關系的目錄。
應用通常只需要有一個base的實例。我們通過declarative_base()功能創建一個基類。
在database_connect.py文件中加入下列代碼
from sqlalchemy.ext.declarative import declarative_base Base = declarative_base(engine)2.創建會話
定義個session會話對象,使用 sessionmaker初始化一個類對象
from sqlalchemy.orm import sessionmaker Session = sessionmaker(engine) session = Session()3.新建模型
新建一個user模型
新建user_module.py文件
from datetime import datetime from sqlalchemy import Column,Integer,String,DateTime,Boolean from database_connect import Base,session class User(Base): __tablename__="user" id = Column(Integer,primary_key=True,autoincrement=True) username = Column(String(20),nullable=False) password = Column(String(100)) creatime = Column(DateTime,default=datetime.now) last_login = Column(DateTime) _locked = Column(Boolean,default=Falsem,nullable=False) #---將創建好的user類,映射到數據庫的user表中---
在start.py mian函數最后中加入這一行代碼
Base.metadata.create_all()
這就是創建好了一個表,我們可以在數據庫中查看一下。
4.增刪查改 1.增加數據def add_user(): #添加單個對象 #person = User(username="lethe",password="212121") #session.add(person) #在start.py中的main函數中執行添加函數 User().add_user()
#添加多個對象 #把add_user中的代碼注釋并添加下列代碼 session.add_all([User(username="banban", password="1212120"), User(username="kuku", password="32321")]) #提交才會生效,和命令行有區別 session.commit()
#先將前面的User().add_user()注釋掉 否者又會添加相同的數據 def search_user(): row = session.query(User).all() # 查詢全部數據 print(row) #再在start.py中的main函數后面添加 User().search_user()
#將search_user()里的內容注釋掉 添加下列代碼 row = session.query(User).filter_by(id=1).all() # 按id查詢 print(row) row = session.query(User).filter(User.username == "banban").all() # 按字段查詢 print(row) print(row[0].locked) #查詢banban這條信息的locked信息
但其實我們可以在定義user類的時候這么去寫
@classmethod def all(cls): return session.query(cls).all() @classmethod def by_id(cls,id): return session.query(cls).filter_by(id=id).all() @classmethod def by_name(cls,name): return session.query(cls).filter_by(username=name).all() @property def locked(self): return self._locked
這樣在只需要調用類方法就行
print(User.all()) print(User.by_id(1)) print(User.by_name("lethe")) print(User.by_name("kuku"))3.更新
def update_user(): row = session.query(User).filter_by(username="lethe").update({User.password:"1010101"}) session.commit()4.刪除
def delete_user(): row = session.query(User).filter_by(username="banban")[0] #first print(row) session.delete(row) session.commit()
更新與刪除操作過程與前面類似 這里就不一一贅述了
以上就是sqlalchemy的基本知識。
設置步驟:
點擊view-->點擊Toll Windows -->點擊database
在在pycharm右側找到database,點開它
點+號-->Data Source--> 選擇mysql(我這里是用的mysql,其他數據庫也行)
按要求填寫對應的項-->點擊Test connection 測試一下是否能成功連接(如果這個按鈕是灰色的需要先點擊左下角的按鈕安裝插件)
start.py
import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web from user_module import User from tornado.options import define, options from database_connect import engine, session from user_module import Base define("port", default=9000, help="run port", type=int) if __name__ == "__main__": connection = engine.connect() result = connection.execute("select 1") print(Base) Base.metadata.create_all() # 建表 User().add_user() # User().search_user() # User().update_user() # User().delete_user() print(User.all()) print(User.by_id(1)) print(User.by_name("lethe")) print(User.by_name("kuku"))
database_connect.py
from sqlalchemy import create_engine HOSTNAME = "127.0.0.1" # 指的是linux的ip 因為代碼運行在linux上 POST = "3306" # 直接在linux上連接數據庫不需要端口轉發 DATABASE = "mydb_test" USERNAME = "admin" # 登錄的用戶 PASSWORD = "Root110qwe" db_url = "mysql+pymysql://{}:{}@{}:{}/{}".format( USERNAME, PASSWORD, HOSTNAME, POST, DATABASE ) # +號兩邊不能加空格 這里出現了點問題 將這個字符串重新寫過后就可以了 engine = create_engine(db_url) # 創建引擎 from sqlalchemy.ext.declarative import declarative_base Base = declarative_base(engine) # print(result.fetchone()) from sqlalchemy.orm import sessionmaker Session = sessionmaker(engine) session = Session()
user_module.py
from datetime import datetime from sqlalchemy import Column, Integer, String, DateTime, Boolean from database_connect import Base, session # 模塊名灰色代表還沒有被調用 class User(Base): # 繼承Base這個引擎 新建表 __tablename__ = "user" # 表名 id = Column(Integer, primary_key=True, autoincrement=True) username = Column(String(20), nullable=False) password = Column(String(50)) email = Column(String(50)) phone_number = Column(String(20)) id_card = Column(String(30)) createtime = Column(DateTime, default=datetime.now) _locked = Column(Boolean, default=False, nullable=True) @classmethod def all(cls): # 類方法 return session.query(cls).all() @classmethod def by_id(cls, id): return session.query(cls).filter_by(id=id).all() @classmethod def by_name(cls, name): return session.query(cls).filter_by(username=name).all() @property def locked(self): return self._locked def __repr__(self): return "" % ( self.id, self.username, self.password, self.email, self.phone_number, self.id_card, self.createtime, self._locked ) def add_user(self): # 添加單個對象 # person = User(username="lethe",password="212121") # session.add(person) # 添加多個對象 session.add_all([User(username="banban", password="1212120"), User(username="kuku", password="32321")]) # 提交才會生效,和命令行有區別 session.commit() def search_user(self): # row = session.query(User).all() # print(row) row = session.query(User).filter_by(id=1).all() print(row) row = session.query(User).filter(User.username == "banban").all() print(row) print(row[0].locked) def update_user(): row = session.query(User).filter_by(username="lethe").update({User.password: "1010101"}) session.commit() def delete_user(): row = session.query(User).filter_by(username="banban")[0] # first print(row) session.delete(row) session.commit()
將上面的這些程序放在同一目錄下 然后運行start.py
再去ubuntu里面的mysql看一下這張表
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44662.html
摘要:菜鳥教程框架中文手冊入門目標使用搭建通過對數據增刪查改沒了純粹占行用的拜 后端API入門學習指北 了解一下一下概念. RESTful API標準] 所有的API都遵循[RESTful API標準]. 建議大家都簡單了解一下HTTP協議和RESTful API相關資料. 阮一峰:理解RESTful架構 阮一峰:RESTful API 設計指南 RESTful API指南 依賴注入 D...
摘要:菜鳥教程框架中文手冊入門目標使用搭建通過對數據增刪查改沒了純粹占行用的拜 后端API入門學習指北 了解一下一下概念. RESTful API標準] 所有的API都遵循[RESTful API標準]. 建議大家都簡單了解一下HTTP協議和RESTful API相關資料. 阮一峰:理解RESTful架構 阮一峰:RESTful API 設計指南 RESTful API指南 依賴注入 D...
摘要:菜鳥教程框架中文手冊入門目標使用搭建通過對數據增刪查改沒了純粹占行用的拜 后端API入門學習指北 了解一下一下概念. RESTful API標準] 所有的API都遵循[RESTful API標準]. 建議大家都簡單了解一下HTTP協議和RESTful API相關資料. 阮一峰:理解RESTful架構 阮一峰:RESTful API 設計指南 RESTful API指南 依賴注入 D...
閱讀 1318·2021-10-27 14:14
閱讀 3574·2021-09-29 09:34
閱讀 2477·2019-08-30 15:44
閱讀 1716·2019-08-29 17:13
閱讀 2569·2019-08-29 13:07
閱讀 867·2019-08-26 18:26
閱讀 3342·2019-08-26 13:44
閱讀 3210·2019-08-26 13:37