SQLalchemy无法找到目标列?

时间:2018-02-16 02:30:38

标签: python sqlalchemy python-3.6

ticker_table = Table('ticker_data', MetaData(),
    Column('id', Integer, primary_key=True),
    Column('ticker', String(100), nullable=False),
    Column('adj_slope', Float(3), nullable=False),
    Column('sector', String(100), nullable=False),
    Column('sub_sector', String(100), nullable=False)
    )
price_data = Table('price_data', MetaData(),
    Column('id', Integer, primary_key=True),
    Column('ticker', String(100), ForeignKey('ticker_data.ticker'), nullable=False),
    Column('date', Date),
    Column('price', Float(3)),
    )
price_data.create(bind=engine)

我收到此错误

  

与'price_data.ticker'列相关联的外键无法找到用于生成目标列'ticker'的外键的表'ticker_data'

我正在使用MySQL Workbench和Python 3.6,以及最新的其他内容。不确定会导致此错误的原因是什么?任何帮助将非常感激。也许是因为我使用的是mysqlclient,因为实际的插件没有更新到python 3.6?我对sqlalchemy的所有事情都比较陌生,所以任何反馈对我都有好处。

2 个答案:

答案 0 :(得分:2)

您的问题是您为每个表使用了两个新的,不相关的MetaData个实例。这样,在sqlalchemy数据结构中,第二个表赢了""""另一个。

正确的做法是为两个表使用单个元数据对象,并在MetaData实例上调用.create_all()一次创建两个:

...
metadata = MetaData()
ticker_table = Table('ticker_data', metadata,
    Column('id', Integer, primary_key=True),
    Column('ticker', String(100), nullable=False),
    Column('adj_slope', Float(3), nullable=False),
    Column('sector', String(100), nullable=False),
    Column('sub_sector', String(100), nullable=False)
    )
price_data = Table('price_data', metadata,
    Column('id', Integer, primary_key=True),
    Column('ticker', String(100), ForeignKey('ticker_data.ticker'), nullable=False),
    Column('date', Date),
    Column('price', Float(3)),
    )

metadata.create_all(bind=engine)

有一种方法可以确保sqlalchemy"看到"另一个表,甚至使用不同的MetaData对象:只引用外键列作为Python对象,而不是字符串。创建表时,它会获取c属性作为列集合 - 因此您可以像这样声明第二个表:

price_data = Table('price_data', MetaData(),
    Column('id', Integer, primary_key=True),
    Column('ticker', String(100), ForeignKey(ticker_table.c.ticker), nullable=False),
    Column('date', Date),
    Column('price', Float(3)),
    )

答案 1 :(得分:0)

尝试使用列名'ticker_data.ticker'替换字符串ticker_table.c.ticker,如下所示:

Column('ticker', String(100), ForeignKey(ticker_table.c.ticker), nullable=False)