Joh*_*ohn 5 python mysql sqlite mysql-python
我正在编写一个Python脚本,用于从MySQL数据库中获取,处理和更新.
我最初开始用MySQL数据库的逗号分隔值转储来攻击这个问题,我将它扔进一个sqlite数据库(使用sqlite3).我在Python(2.7)中进行处理,创建输出的CSV文件,然后用另一个脚本将其上传回MySQL数据库.
那么,我想我会尝试直接从Python脚本拉/推到MySQL数据库.所以我安装了MySQLdb,然后去了镇上.
我现在发现的是,我INSERT从MySQL数据库(到sqlite数据库)的s不会像以前那样加入.整数的表示现在在末尾加上L,十进制值表示为类似的Decimal('4.00').
基本上,JOIN当我从CSV文件中插入它们时很好的东西现在不能很好地工作.
我的问题:我是否要求在这条道路上继续进行痛苦的世界,还是有一种简单的方法可以让MySQLdb和sqlite3库一起玩?如果没有,那么我将安装MySQL服务器并重构我的代码以仅使用MySQL.
每个数据库后端都支持不同类型的数据.sqlite和mysqldb python模块试图通过基于字段类型进行适当的类型转换来帮助您.因此,如果您的mysql数据库具有DECIMAL字段,MySQLdb将自动返回该字段作为Python Decimal对象.
如果需要,可以请求MySQLdb(和sqlite)在数据库和Python类型之间进行适当的类型转换.由您决定哪种类型的转换是合适的.例如,由于您的数据库有一个DECIMAL字段,您如何在sqlite中表示没有本机DECIMAL字段的值?您可能最终会使用REAL,但当然这与DECIMAL不同,后者将保持所需的精度.
由于你已经从csv数据转换,我怀疑你一直在使用Python float类型,表明你很乐意将MySQL十进制字段转换为float.在这种情况下,您可以请求MySQLdb从DECIMAL转换为浮动所有字段结果.
下面是一个代码示例,它创建了两个表,mysqldb和sqlite各一个.MySQL版本有一个DECIMAL字段.您可以在query_dbs函数中看到如何创建自己的转换函数.
#!/usr/bin/env python
import os
import sqlite3
import MySQLdb
from MySQLdb.constants import FIELD_TYPE
user = os.getenv('USER')
def create_mysql_table():
conn = MySQLdb.connect(user=user, db='foo')
c = conn.cursor()
c.execute("DROP TABLE stocks")
c.execute("CREATE TABLE stocks"
"(date text, trans text, symbol text, qty real, price Decimal(10,2) UNSIGNED NOT NULL)")
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
conn.commit()
def create_sqlite_table():
conn = sqlite3.connect('test.db')
c = conn.cursor()
c.execute("DROP TABLE stocks")
c.execute("CREATE TABLE stocks"
"(date text, trans text, symbol text, qty real, price real)")
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
conn.commit()
def query_dbs(use_type_converters):
conn = sqlite3.connect('test.db')
c = conn.cursor()
for row in c.execute('SELECT * FROM stocks'):
print 'SQLITE: %s' % str(row)
type_converters = MySQLdb.converters.conversions.copy()
if use_type_converters:
type_converters.update({
FIELD_TYPE.DECIMAL: float,
FIELD_TYPE.NEWDECIMAL: float,
})
conn = MySQLdb.connect(user=user, db='foo', conv=type_converters)
c = conn.cursor()
c.execute('SELECT * FROM stocks')
for row in c.fetchall():
print 'MYSQLDB: %s' % str(row)
create_sqlite_table()
create_mysql_table()
print "Without type conversion:"
query_dbs(False)
print "With type conversion:"
query_dbs(True)
Run Code Online (Sandbox Code Playgroud)
此脚本在我的机器上生成以下输出:
Without type conversion:
SQLITE: (u'2006-01-05', u'BUY', u'RHAT', 100.0, 35.14)
MYSQLDB: ('2006-01-05', 'BUY', 'RHAT', 100.0, Decimal('35.14'))
With type conversion:
SQLITE: (u'2006-01-05', u'BUY', u'RHAT', 100.0, 35.14)
MYSQLDB: ('2006-01-05', 'BUY', 'RHAT', 100.0, 35.14)
Run Code Online (Sandbox Code Playgroud)
这显示的是,默认情况下MySQLdb返回Decimal类型,但可以强制返回不同的类型,适合与sqlite一起使用.
然后,一旦在两个数据库之间标准化了所有类型,就不应再出现连接问题.
Python MySQLdb文档在这里
| 归档时间: |
|
| 查看次数: |
2678 次 |
| 最近记录: |