【问题标题】:SQLAlchemy: __tablename__ as a variableSQLAlchemy:__tablename__ 作为变量
【发布时间】: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


【解决方案1】:

Stock 类的范围仅限于 create_models 函数。要在函数之外创建此类的对象,您可以从函数中返回该类,然后使用它。

看看下面的解决方案:

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
    return Stock #return the class 

Stock = create_models('ABCD')
tick = Stock('2019-02-12 09:15:00', '287')

查看Python scope tutorial 了解有关范围的更多详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-23
    • 2013-10-10
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2015-01-14
    • 1970-01-01
    相关资源
    最近更新 更多