Skip to content

Commit 8f8fd0f

Browse files
committed
Add id fields for pg8000 support, version-guarded to avoid creating backwards incompatibility with existing stores. First try at getting tests to pass.
1 parent 65b8f62 commit 8f8fd0f

File tree

3 files changed

+46
-16
lines changed

3 files changed

+46
-16
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Tested dialects are:
1919

2020
- SQLite, using the built-in Python driver or, for Python 2.5, pysqlite
2121
- MySQL, using the MySQLdb-python driver or, for Python 3, mysql-connector
22-
- PostgreSQL, using the psycopg2 driver
22+
- PostgreSQL, using the psycopg2 driver (or, on trial, the pg8000 driver)
2323

2424
pysqlite: https://pypi.python.org/pypi/pysqlite
2525

@@ -29,6 +29,7 @@ mysql-connector: http://dev.mysql.com/doc/connector-python/en/connector-python.h
2929

3030
psycopg2: https://pypi.python.org/pypi/psycopg2
3131

32+
pg8000: https://pypi.python.org/pypi/pg8000 (checkout "pg8000" branch)
3233

3334
Development
3435
===========
@@ -102,6 +103,7 @@ Sample DBURI values::
102103
dburi = Literal("mysql://username:password@hostname:port/database-name?other-parameter")
103104
dburi = Literal("mysql+mysqldb://user:password@hostname:port/database?charset=utf8")
104105
dburi = Literal('postgresql+psycopg2://user:pasword@hostname:port/database')
106+
dburi = Literal('postgresql+pg8000://user:pasword@hostname:port/database')
105107
dburi = Literal('sqlite:////absolute/path/to/foo.db')
106108
dburi = Literal("sqlite:///%(here)s/development.sqlite" % {"here": os.getcwd()})
107109
dburi = Literal('sqlite://') # In-memory

rdflib_sqlalchemy/SQLAlchemy.py

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from .termutils import constructGraph
2727
from .termutils import type2TermCombination
2828
from .termutils import statement2TermCombination
29+
from . import __version__
2930

3031
if PY3:
3132
from functools import reduce
@@ -168,13 +169,14 @@ def unionSELECT(selectComponents, distinct=False, selectType=TRIPLE_SELECT):
168169
selectClause = table.select(whereClause)
169170
elif tableType == ASSERTED_TYPE_PARTITION:
170171
selectClause = expression.select(
171-
[table.c.member.label('subject'),
172+
[table.c.id.label('id'),
173+
table.c.member.label('subject'),
172174
expression.literal(str(RDF.type) if PY3 else unicode(RDF.type)).label('predicate'),
173175
table.c.klass.label('object'),
174176
table.c.context.label('context'),
175177
table.c.termComb.label('termcomb'),
176178
expression.literal_column("NULL").label('objlanguage'),
177-
expression.literal_column("NULL").label('objdatatype')],
179+
expression.literal_column("NULL").label('objdatatype')][1 if __version__ <= '0.2' else 0:],
178180
whereClause)
179181
elif tableType == ASSERTED_NON_TYPE_PARTITION:
180182
selectClause = expression.select(
@@ -205,14 +207,25 @@ def extractTriple(tupleRt, store, hardCodedContext=None):
205207
converts it to a tuple of terms using the termComb integer
206208
to interpret how to instantiate each term
207209
"""
208-
try:
209-
subject, predicate, obj, rtContext, termComb, \
210-
objLanguage, objDatatype = tupleRt
211-
termCombString = REVERSE_TERM_COMBINATIONS[termComb]
212-
subjTerm, predTerm, objTerm, ctxTerm = termCombString
213-
except ValueError:
214-
subject, subjTerm, predicate, predTerm, obj, objTerm, \
215-
rtContext, ctxTerm, objLanguage, objDatatype = tupleRt
210+
if __version__ <= "0.2":
211+
try:
212+
subject, predicate, obj, rtContext, termComb, \
213+
objLanguage, objDatatype = tupleRt
214+
termCombString = REVERSE_TERM_COMBINATIONS[termComb]
215+
subjTerm, predTerm, objTerm, ctxTerm = termCombString
216+
except ValueError:
217+
subject, subjTerm, predicate, predTerm, obj, objTerm, \
218+
rtContext, ctxTerm, objLanguage, objDatatype = tupleRt
219+
else:
220+
try:
221+
id, subject, predicate, obj, rtContext, termComb, \
222+
objLanguage, objDatatype = tupleRt
223+
termCombString = REVERSE_TERM_COMBINATIONS[termComb]
224+
subjTerm, predTerm, objTerm, ctxTerm = termCombString
225+
except ValueError:
226+
id, subject, subjTerm, predicate, predTerm, obj, objTerm, \
227+
rtContext, ctxTerm, objLanguage, objDatatype = tupleRt
228+
216229
context = rtContext is not None \
217230
and rtContext \
218231
or hardCodedContext.identifier
@@ -221,7 +234,10 @@ def extractTriple(tupleRt, store, hardCodedContext=None):
221234
o = createTerm(obj, objTerm, store, objLanguage, objDatatype)
222235

223236
graphKlass, idKlass = constructGraph(ctxTerm)
224-
return s, p, o, (graphKlass, idKlass, context)
237+
if __version__ <= "0.2":
238+
return s, p, o, (graphKlass, idKlass, context)
239+
else:
240+
return id, s, p, o, (graphKlass, idKlass, context)
225241

226242

227243
def createTerm(
@@ -881,8 +897,12 @@ class membership columns: member,klass,context termComb
881897
result = res.fetchall()
882898
tripleCoverage = {}
883899
for rt in result:
884-
s, p, o, (graphKlass, idKlass, graphId) = \
885-
extractTriple(rt, self, context)
900+
if __version__ <= "0.2":
901+
s, p, o, (graphKlass, idKlass, graphId) = \
902+
extractTriple(rt, self, context)
903+
else:
904+
id, s, p, o, (graphKlass, idKlass, graphId) = \
905+
extractTriple(rt, self, context)
886906
contexts = tripleCoverage.get((s, p, o), [])
887907
contexts.append(graphKlass(self, idKlass(graphId)))
888908
tripleCoverage[(s, p, o)] = contexts
@@ -1214,6 +1234,7 @@ def __create_table_definitions(self):
12141234
'asserted_statements':
12151235
Table(
12161236
'%s_asserted_statements' % self._internedId, self.metadata,
1237+
Column('id', types.Integer, nullable=False, primary_key=True),
12171238
Column('subject', TermType, nullable=False),
12181239
Column('predicate', TermType, nullable=False),
12191240
Column('object', TermType, nullable=False),
@@ -1228,6 +1249,7 @@ def __create_table_definitions(self):
12281249
Index("%s_A_c_index" % self._internedId, 'context', mysql_length=MYSQL_MAX_INDEX_LENGTH)),
12291250
'type_statements':
12301251
Table('%s_type_statements' % self._internedId, self.metadata,
1252+
Column('id', types.Integer, nullable=False, primary_key=True),
12311253
Column('member', TermType, nullable=False),
12321254
Column('klass', TermType, nullable=False),
12331255
Column('context', TermType, nullable=False),
@@ -1241,6 +1263,7 @@ def __create_table_definitions(self):
12411263
'literal_statements':
12421264
Table(
12431265
'%s_literal_statements' % self._internedId, self.metadata,
1266+
Column('id', types.Integer, nullable=False, primary_key=True),
12441267
Column('subject', TermType, nullable=False),
12451268
Column('predicate', TermType, nullable=False),
12461269
Column('object', TermType),
@@ -1259,6 +1282,7 @@ def __create_table_definitions(self):
12591282
'quoted_statements':
12601283
Table(
12611284
"%s_quoted_statements" % self._internedId, self.metadata,
1285+
Column('id', types.Integer, nullable=False, primary_key=True),
12621286
Column('subject', TermType, nullable=False),
12631287
Column('predicate', TermType, nullable=False),
12641288
Column('object', TermType),
@@ -1283,7 +1307,11 @@ def __create_table_definitions(self):
12831307
Column('uri', types.Text),
12841308
Index("%s_uri_index" % self._internedId, 'uri', mysql_length=MYSQL_MAX_INDEX_LENGTH))
12851309
}
1286-
1310+
if __version__ > "0.2":
1311+
for table in ['type_statements', 'literal_statements',
1312+
'quoted_statements', 'asserted_statements']:
1313+
self.tables[table].append_column(
1314+
Column('id', types.Integer, nullable=False, primary_key=True))
12871315

12881316
table_name_prefixes = [
12891317
'%s_asserted_statements',

rdflib_sqlalchemy/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"""SQLAlchemy Store plugin for RDFLib."""
33
import logging
44
__author__ = "Graham Higgins"
5-
__version__ = "0.2"
5+
__version__ = "0.3"
66

77

88
class NullHandler(logging.Handler):

0 commit comments

Comments
 (0)