【发布时间】:2019-07-05 20:40:32
【问题描述】:
我正在开发一个原型来提取股票价格并将它们转储到数据库中。我想将__tablename__ 作为参数传递给 SQLAchemy,以便将给定股票的股票报价记录到自己的表中。 (顺便说一句,我是 SQLAlchemy 的新手)
我提到了这个帖子:Python Sqlalchemy - tablename as a variable
并想出了以下代码:
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy import Column, String, Integer, Date
Base = declarative_base()
def create_models(tablename):
class Stock(Base):
__tablename__ = tablename
timestamp = Column(String, primary_key=True)
ltp = Column(String)
def __init__(self, timestamp, ltp):
self.timestamp = timestamp
self.ltp = ltp
create_models('ABCD')
engine = create_engine('sqlite:////ticks.db')
Base.metadata.create_all(bind=engine)
session_factory = sessionmaker(bind=engine)
Session = scoped_session(session_factory)()
tick = Stock('2019-02-12 09:15:00', '287')
Session.merge(tick)
Session.commit()
但它失败了:
Traceback (most recent call last):
File "quickies.py", line 32, in <module>
tick = Stock('2019-02-12 09:15:00', '287')
NameError: name 'Stock' is not defined
错误很明显。但后来我不确定如何继续将__tablename__ 作为变量。任何指针都会有很大帮助。
【问题讨论】:
-
表是否已经存在?
-
没有。我相信
Base.metadata.create_all(bind=engine)这一行正在创建表格。如果我删除create_models函数并通过硬编码__tablename__运行代码,则代码可以正常工作。它在第一次运行时创建表,在随后的运行中,它会继续插入记录。 -
将
class Stock带出函数create_models -
@ChetanAmeta,如果我将
class Stock放在create_models之外,那么我如何将__tablename__作为变量传递。 -
在你的函数中使用
return Stock然后Stock = create_models('ABCD')然后tick = Stock('2019-02-12 09:15:00', '287')
标签: python sqlalchemy