2015-06-17 1 views
1

Я хотел бы создать схему для базы данных sqlite3 в python, но sqlite не поддерживает CREATE SCHEMA (sqlite docs). Я просмотрел ATTACH, и похоже, что он выполнит эту работу, используя вторую базу данных, но мне нужна только одна база данных с схемой.Python Sqlite3: создать схему без необходимости использовать вторую базу данных

Я хотел бы сделать что-то вдоль этих линий:

import sqlite3 
db = sqlite3.connect('db_file.db') 
db.execute("CREATE TABLE my_schema.my_table(column TYPE);") 
db.commit() 

Однако, он бросает исключение:

Traceback (most recent call last): 
    File "C:/Users/Mod/Projects/sandbox/test_db.py", line 8, in <module> 
    db.execute("CREATE TABLE my_schema.my_table(column TYPE);") 
OperationalError: unknown database my_schema 

Я знаю, что я могу использовать ATTACH как так ...

import sqlite3 
db = sqlite3.connect('db_file.db') 
db.execute("ATTACH DATABASE 'db_file_2.db' AS 'my_schema';") 
db.execute("CREATE TABLE my_schema.my_table(column TYPE);") 
db.commit() 

... но есть ли способ создать схему без второй базы данных?

+0

Зачем вам вообще нужна схема? Почему бы просто не использовать 'CREATE TABLE my_table (column TYPE);' вместо этого? –

+0

В любом случае основная база данных использует имя схемы 'main'. –

+0

Извините, я должен был уточнить в своем оригинальном посте. Я должен использовать те же запросы INSERT из базы данных MySQL. База данных sqlite3 создается, если соединение mysql db никак не срабатывает. –

ответ

2

Основная база данных всегда называется main, вы не можете изменить это имя.

Вы может просто создать базу данных в оперативной памяти и подключить базу данных к тому, что с помощью произвольного имени:

conn = sqlite3.connect(':memory:') 
conn.execute("attach ? as 'schemaname'", (filename,)) 

Однако, если вы собираетесь использовать базу данных в качестве запасного варианта для основных MySQL, я настоятельно рекомендую вам обратиться к SQLAlchemy, чтобы обрабатывать абстракцию базы данных здесь и позволить ей беспокоиться о генерации правильного SQL для MySQL или SQLite.

+0

Сохранятся ли данные в прикрепленном файле базы данных? Я рассмотрю SQLAlchemy, но мой руководитель использовал [pyodbc] (https://github.com/mkleehammer/pyodbc), поэтому я пытался использовать те же инструменты и пакеты, которые у него уже есть. –

+0

@JohnSmithy: да, вставки будут поступать в нужную базу данных при условии, что вы используете квалифицированное имя. SQLAlchemy может работать с соединениями podbc. –

+0

Удивительно, вот что мне нужно знать. Если бы я мог бы поддержать тебя, я бы! Спасибо за вашу помощь!! –

0

В нашем проекте мы используем Postgresql как производственную базу данных с отдельными схемами для каждой службы. Я хотел использовать Sqlite3 для модульного тестирования. Поэтому мне нужно было создать схему.

accepted answer помог мне разобраться в решении. Я использую SQLAlchemy в своем проекте (в Flask вместе с Flask-SQLAlchemy).

Я хочу поделиться, как я это сделал здесь, в надежде, что это может помочь кому-то.

Предположим, что я использую базу данных в памяти, а схема, которую я хочу использовать, - my_schema. Эти команды будут выглядеть следующим образом:

from sqlalchemy import create_engine 

eng = create_engine("sqlite://") 
conn = eng.connect() 
conn.execute("attach ':memory:' as my_schema") 

Вы можете найти более подробную информацию о SQLite использования в SQLAlchemy на: http://docs.sqlalchemy.org/en/latest/dialects/sqlite.html

В случае, если вы используете колбовую SQLAlchemy, вы могли бы сделать то же самое, как выше примере следующим образом:

from flask_sqlalchemy import SQLAlchemy 

SQLALCHEMY_DATABASE_URI = 'sqlite://' 

db = SQLAlchemy() 
# Create Flask app object, attach it to db object, and then do: 
with app.app_context(): 
    with db.engine.connect() as con: 
     con.execute("attach ':memory:' as svc_kpi") 

 Смежные вопросы

  • Нет связанных вопросов^_^