Python sqlalchemy:没有主键和重复值的表?

Python sqlalchemy:没有主键和重复值的表?,python,sqlalchemy,Python,Sqlalchemy,我正在使用由第三方使用sqlalchemy创建的现有数据库。但是,我遇到了一些问题,因为表没有主键,更糟糕的是,它们的每一行都有重复的元素,所以我不能选择一个现有列作为主键。这些表有两列:都有非唯一值 我试着按照猴子修补桌子,但显然这不起作用(见下文) 我当前的代码是(MirnaTable是我的映射类,基本上只是一个框架,没有其他东西) 然后我试着举个例子 all_records = session.query(MirnaTable).all() 我得到 sqlalchemy.exc.Oper

我正在使用由第三方使用sqlalchemy创建的现有数据库。但是,我遇到了一些问题,因为表没有主键,更糟糕的是,它们的每一行都有重复的元素,所以我不能选择一个现有列作为主键。这些表有两列:都有非唯一值

我试着按照猴子修补桌子,但显然这不起作用(见下文)

我当前的代码是(
MirnaTable
是我的映射类,基本上只是一个框架,没有其他东西)

然后我试着举个例子

all_records = session.query(MirnaTable).all()
我得到

sqlalchemy.exc.OperationalError: (OperationalError) no such column: miranda.id 
u'SELECT miranda.gene_id AS miranda_gene_id, miranda."mature_miRNA" AS
"miranda_mature_miRNA", miranda.id AS miranda_id \nFROM miranda' ()
因此,当然找不到id列。你知道我做错了什么吗?提前谢谢

编辑:根据要求,下面是表中的一个示例(直接从sqlite检索):


首先确保id列存在,然后您尝试了大写和小写

还可以为表设置两个主键:

Column("id", Integer, primary_key=True),
Column("secondColumn", Integer, primary_key=True)

但是,如果任何其他行与该行完全匹配,则这可能会导致更新异常。你最好重新创建表格,插入你自己的PK列,因为你误解了你提到的帖子。必须选择现有列并将其定义为主列。也可以通过将它们全部放在定义中来设置复合主键。在你的例子中,我认为一个基因有几个成熟的microRNA,所以主键应该由
(基因id,成熟的miRNA)
对组成。由于表中没有更多字段,因此不需要使用
autoload=True
标志

db_table = Table("miranda", metadata,
                 Column("gene_id", Integer, primary_key=True),
                 Column("mature_miRNA", Integer, primary_key=True))

我不知道表中的字段类型,因此如果它们不是整数,请适当更改它们。

将sqlite数据库的列id更改为rowid

原件:

修改:


我可以这样做,但我会尽量避免这种情况,因为它来自第三方,这将意味着这样一个数据库的分叉与所有的问题,esue。另外,两个列(我尝试使用monkey patch的列除外)都有重复的值(是的,非常混乱,但我没有这么做…)。编辑:忘了说,“id”列不存在。我按照问题中链接的示例对表进行了monkey patch(但它不起作用)。您能用示例数据发布表吗?完成:有一个示例,说明您现在可以期望什么样的数据。如果没有可以用作行标识的内容,ORM将无法工作。考虑直接使用表,而不将它映射到类。我相应地设置了类型,现在得到了正确的结果(与使用sqlite3的标准查询相比)。根据您在问题中更新的数据,这些对也不是唯一的,因此它们不能用作主键。ORM的某些部分,如简单查询,可以工作,而另一些部分则可能被禁用的重新加载欺骗。但不要期望一切都能成功。我主要使用equality和IN(这是一个非常简单的用例),但我会做一些精确的测试以防万一。
Column("id", Integer, primary_key=True),
Column("secondColumn", Integer, primary_key=True)
db_table = Table("miranda", metadata,
                 Column("gene_id", Integer, primary_key=True),
                 Column("mature_miRNA", Integer, primary_key=True))
db_table = Table("miranda", metadata,
                 Column("id", Integer, primary_key=True),
                 autoload=True)
db_table = Table("miranda", metadata,
                 Column("rowid", Integer, primary_key=True),
                 autoload=True)