python用sqlacodegen根據(jù)已有數(shù)據(jù)庫(kù)(表)結(jié)構(gòu)生成對(duì)應(yīng)SQLAlchemy模型
今天介紹一個(gè)后臺(tái)開發(fā)神器,很適合當(dāng)我們數(shù)據(jù)庫(kù)中已存在了這些表,然后你想得到它們的model類使用ORM技術(shù)進(jìn)行CRUD操作(或者我根本就不知道怎么寫modle類的時(shí)候);
手寫100張表的model類?
這是。。。。。。。。。 是不可能的,這輩子都不可能的。
因?yàn)槲覀冇衧qlacodegen神器, 一行命令獲取數(shù)據(jù)庫(kù)所有表的模型類。
應(yīng)用場(chǎng)景
1、后臺(tái)開發(fā)中,需要經(jīng)常對(duì)數(shù)據(jù)庫(kù)進(jìn)行CRUD操作;
2、這個(gè)過程中,我們就經(jīng)常借助ORM技術(shù)進(jìn)行便利的CURD,比如成熟的SQLAlchemy;
3、但是,進(jìn)行ORM操作前需要提供和table對(duì)應(yīng)的模型類;
4、并且,很多歷史table已經(jīng)存在于數(shù)據(jù)庫(kù)中;
5、如果有幾百?gòu)坱able呢?還自己一個(gè)個(gè)去寫嗎?
6、我相信你心中會(huì)有個(gè)念頭。。。
福音
還是那句話,Python大法好。 這里就介紹一個(gè)根據(jù)已有數(shù)據(jù)庫(kù)(表)結(jié)構(gòu)生成對(duì)應(yīng)SQLAlchemy模型類的神器: sqlacodegen
This is a tool that reads the structure of an existing database and generates the appropriate SQLAlchemy model code, using the declarative style if possible.
安裝方法:
pip install sqlacodegen
快快使用
使用方法也很簡(jiǎn)單,只需要在終端(命令行窗口)運(yùn)行一行命令即可, 將會(huì)獲取到整個(gè)數(shù)據(jù)庫(kù)的model:
常用數(shù)據(jù)庫(kù)的使用方法:
sqlacodegen postgresql:///some_local_db sqlacodegen mysql+oursql://user:password@localhost/dbname sqlacodegen sqlite:///database.db
查看具體參數(shù)可以輸入:
sqlacodegen --help
參數(shù)含義:
optional arguments: -h, --help show this help message and exit --version print the version number and exit --schema SCHEMA load tables from an alternate schema --tables TABLES tables to process (comma-separated, default: all) --noviews ignore views --noindexes ignore indexes --noconstraints ignore constraints --nojoined don't autodetect joined table inheritance --noinflect don't try to convert tables names to singular form --noclasses don't generate classes, only tables --outfile OUTFILE file to write output to (default: stdout)
目前我在postgresql的默認(rèn)的postgres數(shù)據(jù)庫(kù)中有個(gè)這樣的表:
create table friends ( id varchar(3) primary key , address varchar(50) not null , name varchar(10) not null ); create unique index name_address on friends (name, address);
為了使用ORM進(jìn)行操作,我需要獲取它的modle類但唯一索引的model類怎么寫呢? 我們借助sqlacodegen來自動(dòng)生成就好了
sqlacodegen postgresql://ridingroad:ridingroad@127.0.0.1:5432/postgres --outfile=models.py --tables friends
模型類效果
查看輸出到models.py的內(nèi)容
# coding: utf-8
from sqlalchemy import Column, Index, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
metadata = Base.metadata
class Friend(Base):
__tablename__ = 'friends'
__table_args__ = (
Index('name_address', 'name', 'address', unique=True),
)
id = Column(String(3), primary_key=True)
address = Column(String(50), nullable=False)
name = Column(String(10), nullable=False)
如果你有很多表,就直接指定數(shù)據(jù)庫(kù)唄(這是會(huì)生成整個(gè)數(shù)據(jù)庫(kù)的ORM模型類哦),不具體到每張表就好了, 后面就可以愉快的CRUD了,耶
注意事項(xiàng)
Why does it sometimes generate classes and sometimes Tables?
Unless the --noclasses option is used, sqlacodegen tries to generate declarative model classes from each table. There are two circumstances in which a Table is generated instead: 1、the table has no primary key constraint (which is required by SQLAlchemy for every model class) 2、the table is an association table between two other tables
當(dāng)你的表的字段缺少primary key或這張表是有兩個(gè)外鍵約束的時(shí)候,會(huì)生成table而不是模型類了。比如,我那張表是這樣的結(jié)構(gòu):
create table friends ( id varchar(3) , address varchar(50) not null , name varchar(10) not null ); create unique index name_address on friends (name, address);
再執(zhí)行同一個(gè)命令:
sqlacodegen postgresql://ridingroad:ridingroad@127.0.0.1:5432/postgres --outfile=models.py --tables friends
獲取到的是Table:
# coding: utf-8
from sqlalchemy import Column, Index, MetaData, String, Table
metadata = MetaData()
t_friends = Table(
'friends', metadata,
Column('id', String(3)),
Column('address', String(50), nullable=False),
Column('name', String(10), nullable=False),
Index('name_address', 'name', 'address', unique=True)
)
其實(shí)和模型類差不多嘛,但是還是盡量帶上primary key吧,免得手動(dòng)修改成模型類
以上就是python用sqlacodegen根據(jù)已有數(shù)據(jù)庫(kù)(表)結(jié)構(gòu)生成對(duì)應(yīng)SQLAlchemy模型的詳細(xì)內(nèi)容,更多關(guān)于python sqlacodegen的使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python連接mysql數(shù)據(jù)庫(kù)示例(做增刪改操作)
python連接mysql數(shù)據(jù)庫(kù)示例,提供創(chuàng)建表,刪除表,數(shù)據(jù)增、刪、改,批量插入操作,大家參考使用吧2013-12-12
原理解析為什么pydantic可變對(duì)象沒有隨著修改而變化
這篇文章主要介紹了為什么pydantic可變對(duì)象沒有隨著修改而變化的原因解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Python使用pyautogui模塊實(shí)現(xiàn)自動(dòng)化鼠標(biāo)和鍵盤操作示例
這篇文章主要介紹了Python使用pyautogui模塊實(shí)現(xiàn)自動(dòng)化鼠標(biāo)和鍵盤操作,簡(jiǎn)單描述了pyautogui模塊的功能,并結(jié)合實(shí)例形式較為詳細(xì)的分析了Python使用pyautogui模塊實(shí)現(xiàn)鼠標(biāo)與鍵盤自動(dòng)化操作相關(guān)技巧,需要的朋友可以參考下2018-09-09
python對(duì)日志進(jìn)行處理的實(shí)例代碼
本篇文章給大家分享了關(guān)于python處理日志的方法以及相關(guān)實(shí)例代碼,有興趣的朋友們學(xué)習(xí)下。2018-10-10
如何利用Python實(shí)現(xiàn)簡(jiǎn)易的音頻播放器
這篇文章主要介紹了如何利用Python實(shí)現(xiàn)簡(jiǎn)易的音頻播放器,需要用到的庫(kù)有pygame和tkinter,實(shí)現(xiàn)音頻播放的功能,供大家學(xué)習(xí)參考,希望對(duì)你有所幫助2022-03-03
Django模板語法、請(qǐng)求與響應(yīng)的案例詳解
本文主要介紹了Django的模板語法、請(qǐng)求與響應(yīng),包括如何創(chuàng)建和渲染模板文件、傳參機(jī)制、靜態(tài)文件的引入以及如何處理GET和POST請(qǐng)求,通過綜合小案例,展示了如何使用Django實(shí)現(xiàn)一個(gè)簡(jiǎn)單的登錄頁(yè)面并根據(jù)用戶名密碼進(jìn)行驗(yàn)證,感興趣的朋友跟隨小編一起看看2025-01-01

