SQLAlchemy核心在sqlite数据库中未检测到外键

2024-06-26 03:15:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个表“Generations”和“Results”,它们是使用带外键关系的SQL Alchemy创建的世代。个人== 结果.hash你知道吗

但是,当我加载DB时,我无法让SQLAlchemy检测FK关系。我可以查询表对象中的FK,那么为什么会出现NoForeignKeysError?你知道吗

连接

class ForeignKeysListener(sa.interfaces.PoolListener):
    def connect(self, dbapi_con, con_record):
        db_cursor = dbapi_con.execute('pragma foreign_keys=ON')

path_db = r"sqlite:///C:\ExportDir\DB\test.sql"
engine = sa.create_engine(path_db, echo=0, listeners=[util_sa.ForeignKeysListener()])
Session = sessionmaker(bind=engine)
session = Session()

metadata = sa.MetaData()
metadata.reflect(engine)    

这两个表有以下列:

generations_table = metadata.tables['Generations']
print(generations_table.columns) 
# ['Generations.id', 'Generations.gen', 'Generations.individual']

results_table = metadata.tables['Results']
print(results_table.columns)
# ['Results.hash', 'Results.start', 'Results.finish', 'Results.var_c_var0', 'Results.var_c_var1', 'Results.obj_c_obj1', 'Results.obj_c_obj2']

我可以看到以下fk属性

print("gens_table.foreign_keys",generations_table.foreign_keys)
# gens_table.foreign_keys set([ForeignKey(u'Results.hash')])
fk = generations_table.foreign_keys.pop()
print("fk.column",fk.column)
# fk.column Results.hash
print("fk.parent",fk.parent)
# fk.parent Generations.individual

但是,下面会出现一个错误

j = sa.join(generations_table, results_table)
stmt = sa.select([generations_table]).select_from(j)

NoForeignKeysError:找不到“Generations”和“Results”之间的任何外键关系。你知道吗

而手动定义连接列是可行的

j = sa.join(generations_table, results_table, generations_table.c.individual == results_table.c.hash)
stmt = sa.select([generations_table]).select_from(j)

关于如何进一步调试这个有什么想法吗?你知道吗


Tags: 关系satablehashkeysselectresultsengine
1条回答
网友
1楼 · 发布于 2024-06-26 03:15:26

经过更多的努力,我认为问题在于元数据没有绑定到引擎。你知道吗

所以我的解决办法是

engine = sa.create_engine(path_db, echo=0, listeners=[util_sa.ForeignKeysListener()])
metadata = sa.MetaData(bind=engine)
metadata.reflect()

连接现在起作用了。你知道吗

相关问题 更多 >