Python sqlalchemy: таблица без первичных ключей и повторяющихся значений? - PullRequest
5 голосов
/ 15 февраля 2012

Я использую существующую базу данных, созданную третьей стороной с помощью 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 

Ответы [ 3 ]

6 голосов
/ 15 февраля 2012

Вы неверно истолковали сообщение, на которое ссылаетесь. Вы должны выбрать существующий столбец и определить его как основной. Также возможно настроить составной первичный ключ, поместив их все в определение. В вашем случае я думаю, что ген имеет несколько зрелых микроРНК, поэтому первичный ключ, вероятно, должен состоять из пары (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))

Я не знаю типы полей в вашей таблице, поэтому измените их соответствующим образом, если они не являются целочисленными.

0 голосов
/ 26 апреля 2014

Изменить столбец id на rowid для базы данных sqlite

оригинал :

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)
0 голосов
/ 15 февраля 2012

Убедитесь, что сначала существует столбец id, а затем что вы пробовали как верхний, так и нижний регистр.

Также можно установить два первичных ключа для таблицы:

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

Однако это может вызвать аномалии обновления, если любая другая строка точно соответствует этой строке. Возможно, вам лучше всего воссоздать таблицу и вставить свой собственный столбец PK

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...