首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python sqlalchemy :没有主键和重复值的表?

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

Stack Overflow用户
提问于 2012-02-15 18:04:10
回答 3查看 6.9K关注 0票数 7

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

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

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

代码语言:javascript
复制
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()

然后,我尝试执行以下命令

代码语言:javascript
复制
all_records = session.query(MirnaTable).all()

我得到了

代码语言:javascript
复制
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列。知道我哪里做错了吗?提前谢谢。

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

代码语言:javascript
复制
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 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-15 18:41:17

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

代码语言:javascript
复制
db_table = Table("miranda", metadata,
                 Column("gene_id", Integer, primary_key=True),
                 Column("mature_miRNA", Integer, primary_key=True))

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

票数 7
EN

Stack Overflow用户

发布于 2014-04-26 16:28:26

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

原创

代码语言:javascript
复制
db_table = Table("miranda", metadata,
                 Column("id", Integer, primary_key=True),
                 autoload=True)

已修改

代码语言:javascript
复制
db_table = Table("miranda", metadata,
                 Column("rowid", Integer, primary_key=True),
                 autoload=True)
票数 2
EN

Stack Overflow用户

发布于 2012-02-15 18:28:46

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

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

代码语言:javascript
复制
Column("id", Integer, primary_key=True),
Column("secondColumn", Integer, primary_key=True)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9291307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档