今天介紹一個後臺開發神器,很適合當我們資料庫中已存在了這些表,然後你想得到它們的model類使用ORM技術進行CRUD操作(或者我根本就不知道怎麼寫modle類,但我會寫create這個表的sql的時候),手寫100張表的model類?這是。。。。。。。。。 是不可能的,這輩子都不可能的。 因為我們有sqlacodegen神器一行命令獲取資料庫所有表的模型類

應用場景

1、後臺開發中,需要經常對資料庫進行CRUD操作;

2、這個過程中,我們就經常藉助ORM技術進行便利的CURD,比如成熟的SQLAlchemy; 3、但是,進行ORM操作前需要提供和table對應的模型類;

4、並且,很多歷史table已經存在於資料庫中;

5、如果有幾百張table呢?還自己一個個去寫嗎?

6、我相信你心中會有個念頭。。。

福音

還是那句話,Python大法好。 這裡就提供了一個根據已有資料庫(表)結構生成對應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

快快使用

使用方法也很簡單,只需要在終端(命令行窗口)運行一行命令即可: 常用資料庫的使用方法: 將會獲取到整個資料庫的model

sqlacodegen postgresql:///some_local_db
sqlacodegen mysql+oursql://user:password@localhost/dbname
sqlacodegen sqlite:///database.db

查看具體參數可以輸入:

sqlacodegen --help

參數含義:

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 dont autodetect joined table inheritance
--noinflect dont try to convert tables names to singular form
--noclasses dont generate classes, only tables
--outfile OUTFILE file to write output to (default: stdout)

目前我在postgresql的默認的postgres資料庫中有個這樣的表:

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進行操作,我需要獲取它的modle類 但唯一索引的model類怎麼寫呢? 我們藉助sqlacodegen來自動生成就好了

sqlacodegen postgresql://ridingroad:ridingroad@127.0.0.1:5432/postgres --outfile=models.py --tables friends

模型類效果

查看輸出到models.py的內容

# 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)

如果你有很多表,就直接指定資料庫唄(這是會生成整個資料庫的ORM模型類哦),不具體到每張表就好了, 後面就可以愉快的CRUD了,耶

注意事項

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

當你的表的欄位缺少primary key或這張表是有兩個外鍵約束的時候,會生成table而不是模型類了。比如,我那張表是這樣的結構:

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);

再執行同一個命令:

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)
)

其實和模型類差不多嘛,但是還是盡量帶上primary key吧,免得手動修改成模型類

Python全面學習資料

公眾號"Python孫行者"後臺回復」電子書「即可。如果你有什麼好東西好神器,歡迎後臺私信,以後總結隨文分享,耶


推薦閱讀:
相關文章