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的所有事情都比较陌生,所以任何反馈对我都有好处。
答案 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)