簡體   English   中英

Python Sqlite3:無需使用第二個數據庫即可創建模式

[英]Python Sqlite3: Create a schema without having to use a second database

我想在python中為sqlite3數據庫創建一個模式,但sqlite似乎不支持CREATE SCHEMAsqlite docs )。 我已經研究過ATTACH ,看起來它可以通過使用第二個數據庫來完成這項工作,但我只需要一個具有模式的數據庫。

我想沿着這些方向做點什么:

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()

...但有沒有辦法在沒有第二個數據庫的情況下創建架構?

在我們的項目中,我們使用Postgresql作為生產數據庫,每個服務都有單獨的模式。 我想使用Sqlite3進行單元測試。 所以我需要一種方法來創建一個模式。

接受的答案幫助我找到了解決方案。 我在我的項目中使用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")

您可以在以下位置找到有關SQLAlchemy中SQLite用法的更多信息: http//docs.sqlalchemy.org/en/latest/dialects/sqlite.html

如果您使用的是Flask-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")

主數據庫始終命名為main ,您無法更改該名稱。

可以創建一個內存數據庫,並使用任意名稱將數據庫附加到該數據庫:

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

但是,如果您打算將數據庫用作主MySQL數據庫的后備,我建議您查看SQLAlchemy來處理數據庫抽象,並讓它擔心為MySQL或SQLite生成正確的SQL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM