Почему мой внешний ключ в SQLite поврежден? - PullRequest
0 голосов
/ 11 апреля 2020

Я изо всех сил пытаюсь понять, почему мой внешний ключ в SQLite поврежден.

После сокращения моего кода до минимального рабочего примера я застрял с

import sqlite3
import pandas as pd
bar = 99
create_foo = 'CREATE TABLE foo ( id INTEGER PRIMARY KEY, bar INTEGER NOT NULL )'
create_baz = 'CREATE TABLE baz ( ' \
'    id INTEGER PRIMARY KEY,' \
'    foo_id INTEGER NOT NULL,' \
'    FOREIGN KEY(foo_id)' \
'        REFERENCES foo(id) )'
insert_foo = 'INSERT INTO foo (bar) VALUES (?)'
insert_baz = 'INSERT INTO baz (foo_id) VALUES (?)'
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute(create_foo)
c.execute(create_baz)
c.execute(insert_foo, (bar,))
conn.commit()
table = pd.read_sql_query(f'SELECT id FROM foo WHERE bar={bar}', conn)
bar_id = table.loc[0, 'id']
print(bar_id)

, который возвращает 1 и

c = conn.cursor()
c.execute(insert_baz, (bar_id,))
conn.commit()
table = pd.read_sql_query(f'SELECT * FROM baz WHERE foo_id={bar_id}', conn)
print(table.empty)

, который возвращает True

Если я посмотрю на таблицу

pd.read_sql_query('SELECT * FROM baz', conn).loc[0, 'foo_id']

, я увижу, что мой иностранный теперь b'\x01\x00\x00\x00\x00\x00\x00\x00' , пока я ожидал 1.

Как мой внешний ключ поврежден?

1 Ответ

0 голосов
/ 11 апреля 2020

Оказывается, что типы, возвращенные из pandas, и моя вера в автоматическое приведение типов c было моей проблемой.

bar_id в

bar_id = table.loc[0, 'id']

имеет введите np.int64.

Активное приведение этого к нормальному int, то есть

bar_id = int(table.loc[0, 'id'])

, решает мою проблему.

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