通过python设置SQLite数据库的(默认)编码

通过python设置SQLite数据库的(默认)编码,python,python-3.x,sqlite,encoding,Python,Python 3.x,Sqlite,Encoding,我想通过python驱动程序创建一个SQLite数据库。由于应用程序将在不同的操作系统上运行,因此我希望在SQLite数据库中显式指定文本的(默认)编码 显然,我只能在使用以下命令创建数据库之前执行此操作: 我的问题是,Python创建/连接数据库的方法没有指定(至少在我看来)在创建数据库之前设置PRAGMAs(例如编码)的方法() 因此,在创建数据库之前/期间,是否有任何方法可以通过python SQlite驱动程序指定编码 我目前看到的唯一一种解决方法似乎有点老套,就是通过python运行S

我想通过python驱动程序创建一个SQLite数据库。由于应用程序将在不同的操作系统上运行,因此我希望在SQLite数据库中显式指定文本的(默认)编码

显然,我只能在使用以下命令创建数据库之前执行此操作:

我的问题是,Python创建/连接数据库的方法没有指定(至少在我看来)在创建数据库之前设置PRAGMAs(例如编码)的方法()

因此,在创建数据库之前/期间,是否有任何方法可以通过python SQlite驱动程序指定编码


我目前看到的唯一一种解决方法似乎有点老套,就是通过python运行Shell命令,但由于机器上没有安装SQLite CLI,因此这是没有选择的。

您可以创建数据库,然后更改编码

>>> import sqlite3
>>> conn = sqlite3.connect('example.db')
>>> c = conn.cursor()
>>> c.execute('pragma encoding')
<sqlite3.Cursor object at 0x7fa641241e30>
>>> rows = c.fetchall()
>>> for row in rows:
...     print(row)
... 
('UTF-8',)
>>> c.execute('pragma encoding=UTF16')
<sqlite3.Cursor object at 0x7fa641241b20>
>>> c.execute('pragma encoding')
<sqlite3.Cursor object at 0x7fa641241e30>
>>> rows = c.fetchall()
>>> for row in rows:
...     print(row)
... 
('UTF-16le',)
导入sqlite3 >>>conn=sqlite3.connect('example.db') >>>c=连接光标() >>>c.execute('pragma encoding') >>>rows=c.fetchall() >>>对于行中的行: ... 打印(行) ... (‘UTF-8’,) >>>c.execute('pragma encoding=UTF16') >>>c.execute('pragma encoding') >>>rows=c.fetchall() >>>对于行中的行: ... 打印(行) ... (‘UTF-16le’,) 请注意,需要编辑数据库以使这些更改永久化,例如:

>>> sql_create_projects_table = """ CREATE TABLE IF NOT EXISTS projects (
...                                         id integer PRIMARY KEY,
...                                         name text NOT NULL,
...                                         begin_date text,
...                                         end_date text
...                                     ); """
>>> c.execute(sql_create_projects_table)
<sqlite3.Cursor object at 0x7f441ce90e30>
>>> rows = c.fetchall()
>>> for row in rows:
...     print(row)
...
>>> sql = ''' INSERT INTO projects(name,begin_date,end_date)
...               VALUES(?,?,?) '''
>>> project = ('Cool App with SQLite & Python', '2015-01-01', '2015-01-30');
>>> c.execute(sql, project)
<sqlite3.Cursor object at 0x7f441ce90e30>
>>sql\u create\u projects\u table=“”如果不存在项目,则创建表(
…id整数主键,
…名称文本不为空,
…开始日期文本,
…结束日期文本
...                                     ); """
>>>c.execute(sql\u创建\u项目\u表)
>>>rows=c.fetchall()
>>>对于行中的行:
...     打印(行)
...
>>>sql=''插入项目(名称、开始日期、结束日期)
...               值(?,?)''
>>>项目=(‘SQLite和Python的酷应用’、‘2015-01-01’、‘2015-01-30’);
>>>c.执行(sql、项目)

如果不至少添加一个表,则编码将返回到其默认值。希望这能有所帮助。

我能想到的最接近的是数据库,但您应该已经在实例化连接时创建了数据库。事实上,我的建议可能不太适合你想做的事情,但我需要考虑一下guess@roganjosh我考虑过这个问题,但是文本工厂是应用程序和数据库之间的网关。因此,我无法控制数据库保存的内容(采用哪种编码),只能控制如何读取数据。。。。至少,如果我正确理解了他们的C API,从我所看到的来看,
PRAGMA编码是对整个数据库的一次性永久性更改。连接到数据库并执行PRAGMA应该完成所有后续表所需的工作。在这种情况下,API似乎没有针对它的任何其他规定。不,我现在更倾向于您的解释,尝试测试一些东西。我无法让它工作:。编码只适用于一个会话,它只是返回UTF-8。在我尝试更改之前,它已经返回到UTF-8。我认为它对我有效。在关闭之前,尝试在此步骤后添加表和数据。关闭连接,重新建立连接,然后查看是否得到相同的结果。您可以在一个会话中运行所有这些功能。似乎对我很有用(如果我添加一个表)。这似乎使编码更改永久化。我会再做一点实验,如果答案仍然正确,我会把它标记为接受works@JonathanR你的例子对我很有用,我会把它标记为公认的解决方案。你能把你的答案编辑成包含“创建表格”的“黑客”吗?
>>> sql_create_projects_table = """ CREATE TABLE IF NOT EXISTS projects (
...                                         id integer PRIMARY KEY,
...                                         name text NOT NULL,
...                                         begin_date text,
...                                         end_date text
...                                     ); """
>>> c.execute(sql_create_projects_table)
<sqlite3.Cursor object at 0x7f441ce90e30>
>>> rows = c.fetchall()
>>> for row in rows:
...     print(row)
...
>>> sql = ''' INSERT INTO projects(name,begin_date,end_date)
...               VALUES(?,?,?) '''
>>> project = ('Cool App with SQLite & Python', '2015-01-01', '2015-01-30');
>>> c.execute(sql, project)
<sqlite3.Cursor object at 0x7f441ce90e30>