python用sqlacodegen根据已有数据库(表)结构生成对应SQLAlchemy模型
作者:一撸程猿 发布时间:2024-01-23 02:39:44
目录
应用场景
福音
快快使用
模型类效果
注意事项
今天介绍一个后台开发神器,很适合当我们数据库中已存在了这些表,然后你想得到它们的model类使用ORM技术进行CRUD操作(或者我根本就不知道怎么写modle类的时候);
手写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 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的默认的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吧,免得手动修改成模型类
来源:https://juejin.cn/post/6971369096378056741


猜你喜欢
- 虽然这种情况不应该发生,通常像我们关系型数据库,我们应该是事先设计好,以后不能改动,但是由于之前工作的疏忽,其实说实话,也不仅仅是我个人的疏
- php fread函数用于读取文件(可安全用于二进制文件),其语法是fread(file,length),参数file必需,指规定要读取打开
- time()在PHP中是得到一个数字,这个数字表示从1970-01-01到现在共走了多少秒,很奇怪吧 不过这样方便计算, 要找出前一天的时间
- 一、简介简单记录一下存储过程的使用。存储过程是预编译SQL语句集合,也可以包含一些逻辑语句,而且当第一次调用存储过程时,被调用的存储过程会放
- 生日送什么礼物总是要花一番心思,别出心裁不落俗套,什么礼物才能让那一个她开心呢?来看看前端大大用html+css实现动态生日快乐
- 基于Python中求和函数sum的用法详解今天在看《集体编程智慧》这本书的时候,看到一段Python代码,当时是百思不得其解,总觉得是书中排
- 通过 1至10 阶来拟合对比 均方误差及R评分,可以确定最优的“最大阶数”。import numpy as npimport matplot
- 身体是革命的本钱,身体健康了我们才有更多精力做自己想做的事情,追求女神,追求梦想。然而程序员是一个苦比的职业,大部分时间都对着电脑,我现在颈
- 本文实例讲述了Python爬虫实现的根据分类爬取豆瓣电影信息功能。分享给大家供大家参考,具体如下:代码的入口:if __name__ ==
- INSERT table (auto_id, auto_name) values (1, ‘yourname') ON DUPLIC
- 在SQL Server中,如果我想授予一个用户klb拥有创建表的权限,但是我又不想授予其数据库角色db_ddladmin,因为这样会扩大其权
- 惊云JS随机排序程序随机显示信息-每次新闻显示顺序都不一样<script type=text/javascript>//////
- 最近在倒腾一个txt文件,因为文件太大,所以给切割成了好几个小的文件,只有第一个文件有标题,从第二个开始就没有标题了。我的需求是取出指定的列
- 在前面的文章 Python 计算机视觉(十五)—— 图像特效处理 中我已经介绍了大部分的图像的特效处理,但还是忽略了油画特效的处理,在本篇文
- JavaScript Date.toDateString()方法返回一个Date对象的人类可读形式的日期部分。语法Date.to
- 以去掉去掉<!--和-->为例进行说明:def clearContentWithSpecialCharacter(content
- 平常在使用python命令过程中,基本上都是用来安装python库时才使用到在控制台的python命令。然而,python命令还有更多的妙用
- 备注 与 DELETE 语句相比,TRUNCATE TABLE 具有以下优点: 所用的事务日志空间较少。 DELETE 语句每次删除一行,并
- php+lottery.js制作九宫格抽奖实例,本抽奖功能效果表现好,定制方便简单,新手学习跟直接拿来用都非常不错,兼容IE、火狐、谷歌等浏
- 问题你想从一个简单的XML文档中提取数据。解决方案可以使用 xml.etree.ElementTree 模块从简单的XML文档中提取数据。为