[英]Python Sqlite3: Create a schema without having to use a second database
我想在python中為sqlite3數據庫創建一個模式,但sqlite似乎不支持CREATE SCHEMA
( sqlite 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.