Joh*_*thy 6 python database sqlite
我想在 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()
Run Code Online (Sandbox Code Playgroud)
但是,它抛出一个异常:
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
Run Code Online (Sandbox Code Playgroud)
我知道我可以这样使用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()
Run Code Online (Sandbox Code Playgroud)
...但是有没有办法在没有第二个数据库的情况下创建模式?
在我们的项目中,我们使用 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")
Run Code Online (Sandbox Code Playgroud)
您可以在以下位置找到有关 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")
Run Code Online (Sandbox Code Playgroud)
主数据库始终命名为main,您不能更改该名称。
您可以创建一个内存数据库并使用任意名称将数据库附加到该数据库:
conn = sqlite3.connect(':memory:')
conn.execute("attach ? as 'schemaname'", (filename,))
Run Code Online (Sandbox Code Playgroud)
但是,如果您打算使用该数据库作为主 MySQL 数据库的后备,我建议您查看SQLAlchemy来处理这里的数据库抽象,并让它担心为 MySQL 或 SQLite 生成正确的 SQL。