SQLAlchemy ORM,如何实现模板化建表?

2020-08-01 21:21:15 +08:00
 pppguest3962
Base = declarative_base()
engine = create_engine("mysql+pymysql://root:root123@192.168.12.41:3306/testcreattbl?charset=utf8",echo=False)
Session = sessionmaker(bind=engine)
session = Session()
metadata = MetaData(engine)

class tbl_Items(Base):
    __tablename__ = 'Item2017'

    id = Column(INTEGER(64), primary_key=True)
    类型 = Column(String(8))
    序号 = Column(SMALLINT())
    变化时间 = Column(DateTime)
    重量 = Column(DECIMAL(6, 3))
    长 = Column(DECIMAL(6, 3))
    宽 = Column(DECIMAL(6, 3))
    高 = Column(DECIMAL(6, 3))
    UpdateTime = Column(DateTime)
    SQLTAG = Column(String(20))
    __table_args__ = ({'comment': '[ItemsXXX]'})

class tbl_apple(Base):
   #省略

class tbl_banana(Base):
   #省略

ret = engine.dialect.has_table(engine, 'Item2020')
if not ret:
     tbl_Items.__tablename__ = ''Item2020"
     # 这里如何创建一张"Item2020"的表?(同结构 class tbl_Items)

假如我用了 base.metadata.create_all(engine)
testcreattbl 将会其它无关的 tbl_apple,tbl_banana 表都创建了。。。

2062 次点击
所在节点    Python
5 条回复
iConnect
2020-08-01 22:26:07 +08:00
base 本来就是公用的抽出来,你不复用的如果加判断(不知道 sqlalchemy 是不是支持)来处理,还不如在子类里单独写的
pppguest3962
2020-08-02 13:42:00 +08:00
@iConnect ”子类里单独写?“,没能理解这个意思。。。。。,继承了一个子类,如何用这个子类建表呢?
siteshen
2020-08-02 15:58:15 +08:00
你调用 `create_all` 函数,当然会 `create all`了。你不指定,`create_all` 怎么知道你想排除哪些表呢。
yzk66880
2020-08-02 22:36:04 +08:00
啥叫模板化建表? 嫌 create_all 的方式不灵活的话 就 alembic 做表管理
pppguest3962
2020-08-04 09:08:29 +08:00
谢谢各位,
ORM 这种映射方式应该是不能直接这么做,
我用了另外一个方式,用 CrateTable(),获取旧表的原生 sql create 语句成 string 字符串,字符串修改新表名,再 conn.execute(新字符串)。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/694902

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX