请教 sqlalchemy,如何根据映射类定义去创建表?

2020-06-13 23:16:33 +08:00
 qazwsxkevin

如:

Base = declarative_base()
engine = create_engine("mysql+pymysql://root:test123@192.168.9.41:3306/MTData?charset=utf8", echo=False)
Session = sessionmaker(bind=engine)        
session = Session()
metadata = MetaData(engine)

class tbl_mtLive(Base):
    __tablename__ = 'mtLive'

    id = Column(INTEGER(64), primary_key=True)
    timeline = Column(SMALLINT())
    mtuptime = Column(SMALLINT())
    mttext = Column(String(500))
    mtstatus = Column(String(25))
    Strtime = Column(String(25))
    fixStrtime = Column(DateTime)
    mtid = Column(String(10))
    UpdateTime = Column(DateTime)
    SQLTAG = Column(String(20))


MTData 库里面,除了 mtLive 还有 N 张表,
有些已经像 class tbl_mtLive(Base)这样“映射类定义”了,
有些则没有,

请教大家第一个问题是:如果 mtLive 这个表并没有建立,上面这种 ORM 的前提下,如何以 class tbl_mtLive 去创建表? sqlalchemy 的文档看得眼都花了。。。-_-

第二个问题是: 想法是打算把库里面的全部表做一个历遍,
去执行

for i in #这个表集合如何获取?#
    session.execute(f"update {i} set `{k}`='{v[0]}' where mtid = '{i.get('mtid')}' AND timeline = '{i.get('timeline')}'")
    # 更新 UpdateTime
    session.execute(f"update {i} set `UpdateTime`='{ProcFixTime()}' where mtid = '{i.get('mtid')}' AND timeline = '{i.get('timeline')}'")

看了网上的例子,文档和网上有很多的例子是用.cursors,.execute()执行了 SQL 语句,用.fetchall()的方获取到表名,然后开始 do something 的,

请问 ORM 方式是否有方法可以实现?如何做?

尽管在草拟这个帖子的前 1 小时,已经实现
tables = Base.metadata.tables
print(tables)
获得了表名,似乎觉得这样操作不是好办法。。。

1233 次点击
所在节点    Python
2 条回复
gjquoiai
2020-06-14 22:13:43 +08:00
其实没太看懂。。第一个问题应该是 Base.metadata.create_all()?第二个问题可能可以用 automap
myCupOfTea
2020-06-14 23:50:56 +08:00
第二个问题直接用 automap 啊

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

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

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

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

© 2021 V2EX