class Person(Base):
__tablename__ = "person"
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(10), nullable=False)
age = Column(Integer, nullable=False)
def __repr__(self):
return "id:%s,name:%s,age:%s" %(self.id,self.name,self.age)
person = Person(name="jack",age=20)
session.add(person)
session.commit()
1、这句:“ name = Column(String(10), nullable=False)”,官网对 Column 这个函数的说明(我 E 文理解不好),如果 Person 类不用来建表(其实表在库里面,以前就有的,目前操作要达到的目的只是 insert 或者 update ),似乎只用以下的方式就可以了,不用写 String 的长度,不写默认 null 是否允许也是可以的,理解对不对? 其实我也做了个测试,内容是可以写进表的(除了“ id = Column(Integer, primary_key=True, autoincrement=True"这句,必须声明"id"要自增长的参数,否则写入失败)
name = Column(String)
我想问的问题是,在 insert 或者 update 的时候,对于字段数据的类型,长度不说明,sqlalchemy 会怎么样的情况?注不注明比较好?如果 sqlalchemy 的表结构类里,写错了,又会怎么样呢(我自己动手的实验里,跟真实表不一致数据类型,也能写入)
2、第二个问题是承接第一种情况,(就一个)库里已经有过百张表(不要问为什么,我也懵逼),表的字段内容都几乎在 20 个 Column 以上,在使用 sqlalchemy 的时候,几乎要对一半以上的表做操作,那么在定义表结构类的时候,逐一明细写清楚?
这里有个问题,有什么便捷方法,把 mysqk 表结构轻松转成 sqlalchemy 的类定义表达呢?
1
frostming 2019-05-29 09:38:03 +08:00
不写 model 的方式,使用 ORM 操作已存在的表,sqlalchemy 提供自动 map 功能 https://docs.sqlalchemy.org/en/13/orm/extensions/automap.html
从表结构生成 model 代码的方式: https://pypi.org/project/sqlacodegen/ |