각 데이터베이스 백엔드는 서로 다른 유형의 데이터를 지원합니다. sqlite 및 mysqldb python 모듈은 필드 유형에 따라 적절한 유형 변환을 수행하여 사용자를 도와줍니다. 따라서 mysql 데이터베이스에 DECIMAL 필드가 있으면 MySQLdb는 해당 필드를 자동으로 Python Decimal 객체로 반환합니다.
데이터베이스와 파이썬 유형간에 적절한 유형 변환을 수행하기 위해 MySQLdb (및 원하는 경우 sqlite)를 요청할 수 있습니다. 어떤 유형 변환이 적절한 지 결정하는 것은 당신에게 달려 있습니다. 예를 들어, 데이터베이스에 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)
이 스크립트는 내 컴퓨터에 다음과 같은 출력이 생성이 화면이 표시되어 어떤
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)
을 기본적으로 MySQLdb는 진수 형식을 반환하지만, 다른 유형을 반환하도록 강제 할 수있는, 적합 sqlite와 함께 사용하기.
그런 다음 두 데이터베이스간에 모든 유형의 정규화가 완료되면 더 이상 조인에 문제가 없어야합니다.
파이썬 MySQLdb의 문서는
here이 아래로 투표를 한 이유 아무 생각이다. 나는 그것이 좋은 질문이고 +1 가치가 있다고 느낍니다. 그래서 .. +1. –