- 安裝mysql數據庫
- 修改mysql,使得可遠程登錄
-
-- 修改mysql服務器的mysql數據庫的 user 表中的 host字段 update user set host = '%' where user = 'root'; FLUSH RIVILEGES alter user 'root'@'%' identified with mysql_native_password by '[密碼]'; flush privileges;
- 使用ORM (Object Relational Mapping 關係對象映射) 的方式管理數據庫,SQLAlchemy 是ORM的工具
- 安裝 SQLAIchemy
-
$ sudo apt-get update $ sudo pip3 install sqlalchemy
- 將MySQL默認的編碼改爲utf-8
-
$ sudo vim /etc/mysql/my.cnf # 打開文件後添加如下配置 [client] default-character-set = utf8 [mysqld] character-set-server = utf8 [mysql] default-character-set = utf8
- 安裝python與mysql連接的驅動程序
-
$ sudo pip3 install pymysql
- 導入pymysql 並用 pymysql代替 MySQLdb模塊
import pymysql pymysql.install_as_MySQLdb()
- 初始化數據庫連接,並獲取連接數據庫的連接引擎engine
engine = create_engine('mysql+mysqldb://root:root@localhost:3306/testdb?charset=utf8', isolation_level='READ UNCOMMITTED', #定義事務約束條件 echo=False, # 不打印SQL語句 pool_size = 30, # 定義連接池大小 pool_recycle=7200。# 定義連接時長爲2小時 )
SQLAlchemy 是通過 Engine 來驅動,Engine 維護了一個連接池(Pool)對象和方言(Dialect),方言簡單而言就是你連的到底是 MySQL 還是 Oracle 或者 PostgreSQL 還是其它數據庫。連接池很重要,因爲每次發送sql查詢的時候都需要先建立連接,如果程序啓動的時候事先就初始化一批連接放在連接池,每次用完後又放回連接池給其它請求使用,就能大大提高查詢的效率
通過函數 create_engine 就可以創建連接引擎engine
構建好 Engine 對象的同時,連接池和Dialect也創建好了,但是這時候並不會立馬與數據庫建立真正的連接,只有你調用 Engine.connect() 或者 Engine.execute(sql) 執行SQL請求的時候,纔會建立真正的連接。因此 Engine 和 Pool 的行爲稱之爲延遲初始化。
echo :爲 True 時候會把sql語句打印出來
pool_size: 是連接池的大小,默認爲5個,0表示連接數無限制
pool_recycle: MySQL 默認情況下如果一個連接8小時內容沒有任何動作(查詢請求)就會自動斷開鏈接,出現 MySQL has gone away的錯誤。設置了 pool_recycle 後 SQLAlchemy 就會在指定時間內回收連接。如果設置爲3600 就表示 1小時後該連接會被自動回收。
pool_pre_ping : 這是1.2新增的參數,如果值爲True,那麼每次從連接池中拿連接的時候,都會向數據庫發送一個類似 select 1 的測試查詢語句來判斷服務器是否正常運行。當該連接出現 disconnect 的情況時,該連接連同pool中的其它連接都會被回收。 - 創建對象基類
Base = declarative_base()
- 定義與數據庫中表相對應的類
class Test(Base): """ 描述信息 """ __tablename__ = 'test_table' nameId = Column(String(30), primary_key=True) name = Column(String(30),unique=True) # ...
- 實施建表操作,完成類與表的映射
Base.metadata.create_all(engine)
- 創建會話類
Session = sessionmaker(bind=engine)
- 創建會話類對象
session = Session()
- 業務邏輯操作,執行SQL語句
- 執行提交操作,將操作保持到數據庫
session.commit()
- 關閉會話對象
session.close()