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

2024-05-20 19:23:11 发布

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

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

我试图按照http://www.blog.pythonlibrary.org/2010/09/10/sqlalchemy-connecting-to-pre-existing-databases/对表进行猴子修补,但显然这不起作用(见下文)

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

connection = create_engine("sqlite:///targets.sqlite")
metadata = MetaData(bind=connection)
db_table = Table("miranda", metadata,
                 Column("id", Integer, primary_key=True),
                 autoload=True)
mapper(MirnaTable, db_table)
Session = sessionmaker(connection)
session = Session()

然后我试着举个例子

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检索):

gene  mature_miRNA 
---- -------------
80205  hsa-miR-200c 
80205  hsa-miR-200c 
9693  hsa-miR-200c 
9693  hsa-miR-200c 
9881  hsa-miR-200c 
9710  hsa-miR-200c 
9750  hsa-miR-200c 

Tags: iddbsqlitesqlalchemyasconnectionmetadatamir
3条回答

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

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

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

但是,如果任何其他行与此行完全匹配,则这可能会导致更新异常。您最好重新创建表并插入自己的PK列

你误解了你提到的那篇文章。您必须选择一个现有的列并将其定义为primary。还可以通过将组合主键全部放入定义中来设置它们。在你的例子中,我认为一个基因有几个成熟的microRNA,所以主键应该由(gene_id, mature_miRNA)对组成。由于表中不再有字段,因此不需要inautoload=True标志。

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

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

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

原件

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)

相关问题 更多 >