这个基于 SQLite 的 Python 代码是否与 MySQL 兼容?
Will this SQLite based Python code be compatible with MySQL?
我有一个 Python 3 应用程序,它通过执行 SQL 代码字符串(即不使用像 SQLalchemy 这样的 ORM)直接使用 SQLite。数据库正在像这样初始化:
def db_inicialize():
global DB_PATH
print(" - Opening database...\n", DB_PATH)
conn = sqlite3.connect(DB_PATH, detect_types=sqlite3.PARSE_DECLTYPES)
c = conn.cursor()
print(" - Locating or creating database...")
try:
c.execute("""CREATE TABLE IF NOT EXISTS dados (
id INTEGER PRIMARY KEY AUTOINCREMENT,
destin TEXT NOT NULL,
estado TEXT,
obj_num TEXT UNIQUE NOT NULL,
data_exp DATETIME,
valor_cobr TEXT,
chq_recebido TEXT,
data_depositar TEXT,
vols INTEGER,
rma TEXT,
expedidor TEXT NOT NULL,
obs TEXT,
arquivado BOOLEAN,
data_depositado DATETIME,
data_ult_verif DATETIME,
data_ult_alt DATETIME DEFAULT CURRENT_TIMESTAMP,
estado_detalhado TEXT
)""")
except:
print(" - It was not possible to create the main table in database.")
return False
conn.commit()
c.close()
然后我运行这样的代码来改变数据库中的东西:
def db_update_estado(info):
global DB_PATH
estado = verificar_estado(info)
if estado != "- N/A -":
estado_detalhado = obter_estado_detalhado(info)
agora = datetime.now()
try:
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute("""UPDATE dados SET estado = ?, estado_detalhado = ?, data_ult_verif = ? WHERE obj_num = ?;""", (estado, estado_detalhado, agora, remessa))
conn.commit()
c.close()
except:
print(" - It was not possible to update this register in the database!")
是否可以安全使用,例如import pymysql
,调整数据库连接语句并保留所有SQL相关代码?或者我是否需要修改所有 SQL 代码,更改 table 初始化中的数据类型...?
评论太长了。
MySQL和SQLite是不同的数据库。它们确实有很多相似之处,所以如果您细心的话,您可能能够获得适用于两者的代码。但我不打算这样做。
例如,您的 create table
声明为 text unique
。 MySQL 不支持此功能。您需要使用 varchar(xxx)
,其中 xxx 小于某个值(我会使用实际最大值 255)。
date/time 值的处理有很多差异。例如,curdate()
与 date('now')
以及其他函数中的许多差异。 SQLite 支持 CTE; MySQL 没有。
我建议您在自己的模块中构建特定于数据库的功能。或者,使用通用接口,例如 pandas.
我有一个 Python 3 应用程序,它通过执行 SQL 代码字符串(即不使用像 SQLalchemy 这样的 ORM)直接使用 SQLite。数据库正在像这样初始化:
def db_inicialize():
global DB_PATH
print(" - Opening database...\n", DB_PATH)
conn = sqlite3.connect(DB_PATH, detect_types=sqlite3.PARSE_DECLTYPES)
c = conn.cursor()
print(" - Locating or creating database...")
try:
c.execute("""CREATE TABLE IF NOT EXISTS dados (
id INTEGER PRIMARY KEY AUTOINCREMENT,
destin TEXT NOT NULL,
estado TEXT,
obj_num TEXT UNIQUE NOT NULL,
data_exp DATETIME,
valor_cobr TEXT,
chq_recebido TEXT,
data_depositar TEXT,
vols INTEGER,
rma TEXT,
expedidor TEXT NOT NULL,
obs TEXT,
arquivado BOOLEAN,
data_depositado DATETIME,
data_ult_verif DATETIME,
data_ult_alt DATETIME DEFAULT CURRENT_TIMESTAMP,
estado_detalhado TEXT
)""")
except:
print(" - It was not possible to create the main table in database.")
return False
conn.commit()
c.close()
然后我运行这样的代码来改变数据库中的东西:
def db_update_estado(info):
global DB_PATH
estado = verificar_estado(info)
if estado != "- N/A -":
estado_detalhado = obter_estado_detalhado(info)
agora = datetime.now()
try:
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute("""UPDATE dados SET estado = ?, estado_detalhado = ?, data_ult_verif = ? WHERE obj_num = ?;""", (estado, estado_detalhado, agora, remessa))
conn.commit()
c.close()
except:
print(" - It was not possible to update this register in the database!")
是否可以安全使用,例如import pymysql
,调整数据库连接语句并保留所有SQL相关代码?或者我是否需要修改所有 SQL 代码,更改 table 初始化中的数据类型...?
评论太长了。
MySQL和SQLite是不同的数据库。它们确实有很多相似之处,所以如果您细心的话,您可能能够获得适用于两者的代码。但我不打算这样做。
例如,您的 create table
声明为 text unique
。 MySQL 不支持此功能。您需要使用 varchar(xxx)
,其中 xxx 小于某个值(我会使用实际最大值 255)。
date/time 值的处理有很多差异。例如,curdate()
与 date('now')
以及其他函数中的许多差异。 SQLite 支持 CTE; MySQL 没有。
我建议您在自己的模块中构建特定于数据库的功能。或者,使用通用接口,例如 pandas.