Python SQLalchemy不能';找不到目标列?

Python SQLalchemy不能';找不到目标列?,python,sqlalchemy,python-3.6,Python,Sqlalchemy,Python 3.6,我犯了这个错误 与列“price_data.ticker”关联的外键找不到表“ticker_data”,用于生成目标列“ticker”的外键 我将MySQL Workbench与Python3.6以及其他最新版本一起使用。不确定是什么导致此错误?任何帮助都将不胜感激。可能是因为我正在使用mysqlclient,因为实际的插件没有更新到python3.6?我对sqlalchemy的所有东西都比较陌生,所以任何反馈都会让我受益匪浅。您的问题是,您正在为每个表使用两个新的、不相关的元数据实例。这样,在

我犯了这个错误

与列“price_data.ticker”关联的外键找不到表“ticker_data”,用于生成目标列“ticker”的外键


我将MySQL Workbench与Python3.6以及其他最新版本一起使用。不确定是什么导致此错误?任何帮助都将不胜感激。可能是因为我正在使用mysqlclient,因为实际的插件没有更新到python3.6?我对sqlalchemy的所有东西都比较陌生,所以任何反馈都会让我受益匪浅。

您的问题是,您正在为每个表使用两个新的、不相关的
元数据
实例。这样,在sqlalchemy数据结构中,第二个表不会“看到”另一个表

正确的做法是为两个表使用一个元数据对象,并通过调用元数据实例上的
.create_all()
立即创建这两个表:

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)
有一种方法可以确保sqlalchemy“看到”另一个表,甚至使用不同的元数据对象:只需将外键列引用为Python对象,而不是字符串。当您创建一个表时,它会获取列集合的
c
属性,因此您可以像这样声明第二个表:

...
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)

尝试用列名
ticker\u table.c.ticker
替换字符串
'ticker\u data.ticker'
,如下所示:


Column('ticker',String(100),ForeignKey(ticker\u table.c.ticker),nullable=False)

在调用
price\u data
之前,您是否尝试过在ticker\u数据表上运行
?是的@jsbueno我刚刚为ticker\u表留下了表轮廓,以便人们可以看到它是如何创建的。我从数据库中删除了以前的ticker\u表,并按照您所说的那样使用了.create\u all()和元数据变量,并获得此错误。(\u mysql\u exceptions.IntegrityError)(1215,“无法添加外键约束”)[SQL:“\n创建表价格数据(\n\tid INTEGER NOT NULL AUTO\u INCREMENT,\n\tticker VARCHAR(100)NOT NULL,\n\t日期,\n\t价格浮动(3),\n\t主键(id),\n\t外键(ticker)引用ticker数据(ticker)\n\n'](此错误的背景信息位于:)嗯,即使有了股票代码,我还是会得到同样的错误1215?另一个stackoverflow页面说数据类型不同。然而,股票代码都被设置为字符串(100)…不确定,只是在谷歌上搜索了这个:-检查原因5:引用的字段应该被索引或一个键!对不起,我不太明白索引或键到底是什么?我想在列属性下添加一个index=True吗?谢谢
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)),
    )