我正在使用第三方使用sqlalchemy创建的现有数据库。但是,我遇到了麻烦,因为表没有primar密钥,更糟糕的是,它们每行都有重复的元素,所以我不能选择现有的列作为主键。这些表有两列:两列都有非唯一值。
我试图按照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
答案 0 :(得分:6)
你误解了你引用的帖子。您必须选择现有列并将其定义为主要列。也可以通过将它们全部放在定义中来设置复合主键。在你的情况下,我认为一个基因有几个成熟的microRNA,所以主键可能应该由(gene_id, mature_miRNA)
对组成。由于表中没有其他字段,因此不需要autoload=True
标记。
db_table = Table("miranda", metadata,
Column("gene_id", Integer, primary_key=True),
Column("mature_miRNA", Integer, primary_key=True))
我不知道表中字段的类型,因此如果它们不是整数,则适当地更改它们。
答案 1 :(得分:0)
确保id列首先存在,然后你已经尝试过大写和小写。
也可以为表格设置两个主键:
Column("id", Integer, primary_key=True),
Column("secondColumn", Integer, primary_key=True)
但是,如果任何其他行与此行完全匹配,则可能会导致更新异常。您可能最好重新创建表并插入自己的PK列
答案 2 :(得分:0)
将sillarite数据库 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)